From fcea4c63a7d70a3eeee3e3a00c1bd7f2125dd4f9 Mon Sep 17 00:00:00 2001 From: chenchun Date: Thu, 27 Jun 2024 18:37:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Yi.Abp.Net8/Yi.Abp.sln | 21 +++++++++----- .../Entities/SettingAggregateRoot.cs | 18 ------------ .../Managers/AccountManager.cs | 2 +- .../SettingManagementAppServiceBase.cs | 12 ++++++++ ...ework.SettingManagement.Application.csproj | 17 +++++++++++ ...eworkSettingManagementApplicationModule.cs | 15 ++++++++++ .../ISettingRepository.cs | 8 +++--- ...ttingEntity.cs => SettingAggregateRoot.cs} | 9 ++++-- .../SettingCacheItemInvalidator.cs | 4 +-- .../SettingManagementStore.cs | 2 +- ....Framework.SettingManagement.Domain.csproj | 4 +++ .../SqlSugarCoreSettingRepository.cs | 8 +++--- .../Yi.Abp.Application.Contracts.csproj | 4 ++- .../YiAbpApplicationContractsModule.cs | 4 ++- .../Services/TestService.cs | 27 ++++++++++++++++-- .../Yi.Abp.Application.csproj | 3 +- .../YiAbpApplicationModule.cs | 5 +++- .../Yi.Abp.Domain.Shared.csproj | 3 ++ .../YiAbpDomainSharedModule.cs | 2 ++ .../src/Yi.Abp.Domain/Yi.Abp.Domain.csproj | 4 ++- .../src/Yi.Abp.Domain/YiAbpDomainModule.cs | 4 ++- .../Yi.Abp.SqlSugarCore.csproj | 2 ++ .../YiAbpSqlSugarCoreModule.cs | 2 ++ Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db | Bin 0 -> 487424 bytes 24 files changed, 132 insertions(+), 48 deletions(-) delete mode 100644 Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/SettingAggregateRoot.cs create mode 100644 Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Application/SettingManagementAppServiceBase.cs create mode 100644 Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Application/Yi.Framework.SettingManagement.Application.csproj create mode 100644 Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Application/YiFrameworkSettingManagementApplicationModule.cs rename Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/{SettingEntity.cs => SettingAggregateRoot.cs} (83%) create mode 100644 Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db diff --git a/Yi.Abp.Net8/Yi.Abp.sln b/Yi.Abp.Net8/Yi.Abp.sln index fef906fa..0a1bd352 100644 --- a/Yi.Abp.Net8/Yi.Abp.sln +++ b/Yi.Abp.Net8/Yi.Abp.sln @@ -152,19 +152,21 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Rbac.Test", "t EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tool", "tool", "{084CBEEC-5D37-4716-B9C7-D80D6960DFF4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Abp.Tool", "tool\Yi.Abp.Tool\Yi.Abp.Tool.csproj", "{4FEBBDD9-E4F4-4BAF-8599-E2D57C08A74F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool", "tool\Yi.Abp.Tool\Yi.Abp.Tool.csproj", "{4FEBBDD9-E4F4-4BAF-8599-E2D57C08A74F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Abp.Tool.Web", "tool\Yi.Abp.Tool.Web\Yi.Abp.Tool.Web.csproj", "{2CE51D4C-1EF9-462B-BA14-7EA01A7E4AF1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool.Web", "tool\Yi.Abp.Tool.Web\Yi.Abp.Tool.Web.csproj", "{2CE51D4C-1EF9-462B-BA14-7EA01A7E4AF1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Abp.Tool.Application", "tool\Yi.Abp.Tool.Application\Yi.Abp.Tool.Application.csproj", "{776590BA-B900-4C8B-986A-5B721FA4B306}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool.Application", "tool\Yi.Abp.Tool.Application\Yi.Abp.Tool.Application.csproj", "{776590BA-B900-4C8B-986A-5B721FA4B306}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Abp.Tool.Application.Contracts", "tool\Yi.Abp.Tool.Application.Contracts\Yi.Abp.Tool.Application.Contracts.csproj", "{3A3AF1ED-FC7F-48CF-8ACE-9D50426B4675}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool.Application.Contracts", "tool\Yi.Abp.Tool.Application.Contracts\Yi.Abp.Tool.Application.Contracts.csproj", "{3A3AF1ED-FC7F-48CF-8ACE-9D50426B4675}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Abp.Tool.Domain", "tool\Yi.Abp.Tool.Domain\Yi.Abp.Tool.Domain.csproj", "{68F73B7B-0F8A-41C1-8092-6D6FFAED32F8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool.Domain", "tool\Yi.Abp.Tool.Domain\Yi.Abp.Tool.Domain.csproj", "{68F73B7B-0F8A-41C1-8092-6D6FFAED32F8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Abp.Tool.Domain.Shared", "tool\Yi.Abp.Tool.Domain.Shared\Yi.Abp.Tool.Domain.Shared.csproj", "{4AE84CDE-2A47-4D68-8E93-86193F72E4E8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool.Domain.Shared", "tool\Yi.Abp.Tool.Domain.Shared\Yi.Abp.Tool.Domain.Shared.csproj", "{4AE84CDE-2A47-4D68-8E93-86193F72E4E8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Abp.Tool.HttpApi.Client", "tool\Yi.Abp.Tool.HttpApi.Client\Yi.Abp.Tool.HttpApi.Client.csproj", "{C8F97775-D903-4365-A4FF-3DA97E318CD2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool.HttpApi.Client", "tool\Yi.Abp.Tool.HttpApi.Client\Yi.Abp.Tool.HttpApi.Client.csproj", "{C8F97775-D903-4365-A4FF-3DA97E318CD2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.SettingManagement.Application", "module\setting-management\Yi.Framework.SettingManagement.Application\Yi.Framework.SettingManagement.Application.csproj", "{2A31D7CB-BDCC-4253-BA73-273B6B5E1956}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -420,6 +422,10 @@ Global {C8F97775-D903-4365-A4FF-3DA97E318CD2}.Debug|Any CPU.Build.0 = Debug|Any CPU {C8F97775-D903-4365-A4FF-3DA97E318CD2}.Release|Any CPU.ActiveCfg = Release|Any CPU {C8F97775-D903-4365-A4FF-3DA97E318CD2}.Release|Any CPU.Build.0 = Release|Any CPU + {2A31D7CB-BDCC-4253-BA73-273B6B5E1956}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2A31D7CB-BDCC-4253-BA73-273B6B5E1956}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A31D7CB-BDCC-4253-BA73-273B6B5E1956}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2A31D7CB-BDCC-4253-BA73-273B6B5E1956}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -494,6 +500,7 @@ Global {68F73B7B-0F8A-41C1-8092-6D6FFAED32F8} = {084CBEEC-5D37-4716-B9C7-D80D6960DFF4} {4AE84CDE-2A47-4D68-8E93-86193F72E4E8} = {084CBEEC-5D37-4716-B9C7-D80D6960DFF4} {C8F97775-D903-4365-A4FF-3DA97E318CD2} = {084CBEEC-5D37-4716-B9C7-D80D6960DFF4} + {2A31D7CB-BDCC-4253-BA73-273B6B5E1956} = {8C68059E-F3B1-4D28-A1C9-A5830F53E5D3} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {23D6FBC9-C970-4641-BC1E-2AEA59F51C18} diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/SettingAggregateRoot.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/SettingAggregateRoot.cs deleted file mode 100644 index a4881e0e..00000000 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/SettingAggregateRoot.cs +++ /dev/null @@ -1,18 +0,0 @@ -using SqlSugar; -using Volo.Abp.Domain.Entities; - -namespace Yi.Framework.Bbs.Domain.Entities -{ - [SugarTable("Setting")] - public class SettingAggregateRoot : AggregateRoot - { - - [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] - public override Guid Id { get; protected set; } - public int CommentPage { get; set; } - public int DiscussPage { get; set; } - public int CommentExperience { get; set; } - public int DiscussExperience { get; set; } - public string Title { get; set; } - } -} diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/AccountManager.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/AccountManager.cs index 4e2ba7ff..b7a58206 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/AccountManager.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/AccountManager.cs @@ -83,7 +83,7 @@ namespace Yi.Framework.Rbac.Domain.Managers { throw new UserFriendlyException(UserConst.No_Permission); } - //这里抛出一个登录的事件 + //这里抛出一个登录的事件,也可以在全部流程走完,在应用层组装 if (_httpContextAccessor.HttpContext is not null) { var loginEntity = new LoginLogAggregateRoot().GetInfoByHttpContext(_httpContextAccessor.HttpContext); diff --git a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Application/SettingManagementAppServiceBase.cs b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Application/SettingManagementAppServiceBase.cs new file mode 100644 index 00000000..03ba0bc2 --- /dev/null +++ b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Application/SettingManagementAppServiceBase.cs @@ -0,0 +1,12 @@ +using Volo.Abp.Application.Services; +using Volo.Abp.SettingManagement.Localization; + +namespace Yi.Framework.SettingManagement.Application; + +public abstract class SettingManagementAppServiceBase : ApplicationService +{ + protected SettingManagementAppServiceBase() + { + LocalizationResource = typeof(AbpSettingManagementResource); + } +} diff --git a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Application/Yi.Framework.SettingManagement.Application.csproj b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Application/Yi.Framework.SettingManagement.Application.csproj new file mode 100644 index 00000000..b009a768 --- /dev/null +++ b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Application/Yi.Framework.SettingManagement.Application.csproj @@ -0,0 +1,17 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + diff --git a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Application/YiFrameworkSettingManagementApplicationModule.cs b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Application/YiFrameworkSettingManagementApplicationModule.cs new file mode 100644 index 00000000..6bb5d69a --- /dev/null +++ b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Application/YiFrameworkSettingManagementApplicationModule.cs @@ -0,0 +1,15 @@ +using Volo.Abp.Application; +using Volo.Abp.Modularity; +using Volo.Abp.SettingManagement; +using Volo.Abp.Timing; + +namespace Yi.Framework.SettingManagement.Application; + +[DependsOn( + typeof(AbpDddApplicationModule), + typeof(AbpSettingManagementApplicationContractsModule), + typeof(AbpTimingModule) +)] +public class YiFrameworkSettingManagementApplicationModule : AbpModule +{ +} diff --git a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/ISettingRepository.cs b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/ISettingRepository.cs index b45823db..404804e2 100644 --- a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/ISettingRepository.cs +++ b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/ISettingRepository.cs @@ -6,20 +6,20 @@ using Volo.Abp.Domain.Repositories; namespace Yi.Framework.SettingManagement.Domain; -public interface ISettingRepository : IBasicRepository +public interface ISettingRepository : IBasicRepository { - Task FindAsync( + Task FindAsync( string name, string providerName, string providerKey, CancellationToken cancellationToken = default); - Task> GetListAsync( + Task> GetListAsync( string providerName, string providerKey, CancellationToken cancellationToken = default); - Task> GetListAsync( + Task> GetListAsync( string[] names, string providerName, string providerKey, diff --git a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingEntity.cs b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingAggregateRoot.cs similarity index 83% rename from Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingEntity.cs rename to Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingAggregateRoot.cs index 619dc64c..7276fa90 100644 --- a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingEntity.cs +++ b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingAggregateRoot.cs @@ -1,10 +1,13 @@ using JetBrains.Annotations; +using SqlSugar; using Volo.Abp; using Volo.Abp.Domain.Entities; +using Check = Volo.Abp.Check; namespace Yi.Framework.SettingManagement.Domain; -public class SettingEntity : Entity, IAggregateRoot +[SugarTable("Setting")] +public class SettingAggregateRoot : Entity, IAggregateRoot { [NotNull] public virtual string Name { get; protected set; } @@ -18,12 +21,12 @@ public class SettingEntity : Entity, IAggregateRoot [CanBeNull] public virtual string ProviderKey { get; protected set; } - public SettingEntity() + public SettingAggregateRoot() { } - public SettingEntity( + public SettingAggregateRoot( Guid id, [NotNull] string name, [NotNull] string value, diff --git a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingCacheItemInvalidator.cs b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingCacheItemInvalidator.cs index c8c5278a..7d55ac13 100644 --- a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingCacheItemInvalidator.cs +++ b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingCacheItemInvalidator.cs @@ -6,7 +6,7 @@ using Volo.Abp.EventBus; namespace Yi.Framework.SettingManagement.Domain; -public class SettingCacheItemInvalidator : ILocalEventHandler>, ITransientDependency +public class SettingCacheItemInvalidator : ILocalEventHandler>, ITransientDependency { protected IDistributedCache Cache { get; } @@ -15,7 +15,7 @@ public class SettingCacheItemInvalidator : ILocalEventHandler eventData) + public virtual async Task HandleEventAsync(EntityChangedEventData eventData) { var cacheKey = CalculateCacheKey( eventData.Entity.Name, diff --git a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingManagementStore.cs b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingManagementStore.cs index 86a52d45..bbb1607c 100644 --- a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingManagementStore.cs +++ b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/SettingManagementStore.cs @@ -41,7 +41,7 @@ public class SettingManagementStore : ISettingManagementStore, ITransientDepende var setting = await SettingRepository.FindAsync(name, providerName, providerKey); if (setting == null) { - setting = new SettingEntity(GuidGenerator.Create(), name, value, providerName, providerKey); + setting = new SettingAggregateRoot(GuidGenerator.Create(), name, value, providerName, providerKey); await SettingRepository.InsertAsync(setting); } else diff --git a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/Yi.Framework.SettingManagement.Domain.csproj b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/Yi.Framework.SettingManagement.Domain.csproj index 4f307300..b1890f7c 100644 --- a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/Yi.Framework.SettingManagement.Domain.csproj +++ b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.Domain/Yi.Framework.SettingManagement.Domain.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.SqlSugarCore/SqlSugarCoreSettingRepository.cs b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.SqlSugarCore/SqlSugarCoreSettingRepository.cs index f4972cc4..db565913 100644 --- a/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.SqlSugarCore/SqlSugarCoreSettingRepository.cs +++ b/Yi.Abp.Net8/module/setting-management/Yi.Framework.SettingManagement.SqlSugarCore/SqlSugarCoreSettingRepository.cs @@ -4,14 +4,14 @@ using Yi.Framework.SqlSugarCore.Repositories; namespace Volo.Abp.SettingManagement.EntityFrameworkCore; -public class SqlSugarCoreSettingRepository : SqlSugarRepository, +public class SqlSugarCoreSettingRepository : SqlSugarRepository, ISettingRepository { public SqlSugarCoreSettingRepository(ISugarDbContextProvider sugarDbContextProvider) : base(sugarDbContextProvider) { } - public virtual async Task FindAsync( + public virtual async Task FindAsync( string name, string providerName, string providerKey, @@ -23,7 +23,7 @@ public class SqlSugarCoreSettingRepository : SqlSugarRepository> GetListAsync( + public virtual async Task> GetListAsync( string providerName, string providerKey, CancellationToken cancellationToken = default) @@ -34,7 +34,7 @@ public class SqlSugarCoreSettingRepository : SqlSugarRepository> GetListAsync( + public virtual async Task> GetListAsync( string[] names, string providerName, string providerKey, diff --git a/Yi.Abp.Net8/src/Yi.Abp.Application.Contracts/Yi.Abp.Application.Contracts.csproj b/Yi.Abp.Net8/src/Yi.Abp.Application.Contracts/Yi.Abp.Application.Contracts.csproj index 2f90eaa3..0c0cd33e 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Application.Contracts/Yi.Abp.Application.Contracts.csproj +++ b/Yi.Abp.Net8/src/Yi.Abp.Application.Contracts/Yi.Abp.Application.Contracts.csproj @@ -9,7 +9,9 @@ - + + + diff --git a/Yi.Abp.Net8/src/Yi.Abp.Application.Contracts/YiAbpApplicationContractsModule.cs b/Yi.Abp.Net8/src/Yi.Abp.Application.Contracts/YiAbpApplicationContractsModule.cs index ccc77746..42fc4229 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Application.Contracts/YiAbpApplicationContractsModule.cs +++ b/Yi.Abp.Net8/src/Yi.Abp.Application.Contracts/YiAbpApplicationContractsModule.cs @@ -1,4 +1,5 @@ -using Yi.Abp.Domain.Shared; +using Volo.Abp.SettingManagement; +using Yi.Abp.Domain.Shared; using Yi.Framework.Bbs.Application.Contracts; using Yi.Framework.ChatHub.Application.Contracts; using Yi.Framework.Ddd.Application.Contracts; @@ -13,6 +14,7 @@ namespace Yi.Abp.Application.Contracts typeof(YiFrameworkRbacApplicationContractsModule), typeof(YiFrameworkBbsApplicationContractsModule), typeof(YiFrameworkChatHubApplicationContractsModule), + typeof(AbpSettingManagementApplicationContractsModule), typeof(YiFrameworkTenantManagementApplicationContractsModule), typeof(YiFrameworkDddApplicationContractsModule))] diff --git a/Yi.Abp.Net8/src/Yi.Abp.Application/Services/TestService.cs b/Yi.Abp.Net8/src/Yi.Abp.Application/Services/TestService.cs index e8c6bcb2..53e2af71 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Application/Services/TestService.cs +++ b/Yi.Abp.Net8/src/Yi.Abp.Application/Services/TestService.cs @@ -2,11 +2,13 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.RateLimiting; using Volo.Abp.Application.Services; +using Volo.Abp.Settings; using Volo.Abp.Uow; using Yi.Framework.Bbs.Application.Contracts.Dtos.Banner; using Yi.Framework.Bbs.Domain.Entities.Forum; using Yi.Framework.Rbac.Domain.Authorization; using Yi.Framework.Rbac.Domain.Extensions; +using Yi.Framework.SettingManagement.Domain; using Yi.Framework.SqlSugarCore.Abstractions; namespace Yi.Abp.Application.Services @@ -120,7 +122,7 @@ namespace Yi.Abp.Application.Services var dto = entity.Adapt(); } - + private static int RequestNumber { get; set; } = 0; /// /// 速率限制 /// @@ -132,6 +134,27 @@ namespace Yi.Abp.Application.Services RequestNumber++; return RequestNumber; } - private static int RequestNumber { get; set; } = 0; + + + public ISettingProvider _settingProvider { get; set; } + + public ISettingManager _settingManager { get; set; } + /// + /// 系统配置模块 + /// + /// + public async Task GetSettingAsync() + { + //默认来说,不提供修改操作,配置应该独立 + var enableOrNull = await _settingProvider.GetOrNullAsync("abp.ddd.enable"); + + //如果要进行修改,可使用yi.framework下的ISettingManager + await _settingManager.SetAsync("abp.ddd.enable", "false", "系统", "admin"); + + var enableOrNull2 = await _settingProvider.GetOrNullAsync("abp.ddd.enable"); + + return enableOrNull2 ?? string.Empty; + } + } } diff --git a/Yi.Abp.Net8/src/Yi.Abp.Application/Yi.Abp.Application.csproj b/Yi.Abp.Net8/src/Yi.Abp.Application/Yi.Abp.Application.csproj index c25d7387..0fba17dc 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Application/Yi.Abp.Application.csproj +++ b/Yi.Abp.Net8/src/Yi.Abp.Application/Yi.Abp.Application.csproj @@ -8,10 +8,11 @@ + - + diff --git a/Yi.Abp.Net8/src/Yi.Abp.Application/YiAbpApplicationModule.cs b/Yi.Abp.Net8/src/Yi.Abp.Application/YiAbpApplicationModule.cs index 939e5440..87cafe95 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Application/YiAbpApplicationModule.cs +++ b/Yi.Abp.Net8/src/Yi.Abp.Application/YiAbpApplicationModule.cs @@ -1,10 +1,12 @@ -using Yi.Abp.Application.Contracts; +using Volo.Abp.SettingManagement; +using Yi.Abp.Application.Contracts; using Yi.Abp.Domain; using Yi.Framework.Bbs.Application; using Yi.Framework.ChatHub.Application; using Yi.Framework.CodeGen.Application; using Yi.Framework.Ddd.Application; using Yi.Framework.Rbac.Application; +using Yi.Framework.SettingManagement.Application; using Yi.Framework.TenantManagement.Application; namespace Yi.Abp.Application @@ -19,6 +21,7 @@ namespace Yi.Abp.Application typeof(YiFrameworkChatHubApplicationModule), typeof(YiFrameworkTenantManagementApplicationModule), typeof(YiFrameworkCodeGenApplicationModule), + typeof (YiFrameworkSettingManagementApplicationModule), typeof(YiFrameworkDddApplicationModule) )] diff --git a/Yi.Abp.Net8/src/Yi.Abp.Domain.Shared/Yi.Abp.Domain.Shared.csproj b/Yi.Abp.Net8/src/Yi.Abp.Domain.Shared/Yi.Abp.Domain.Shared.csproj index 3b9750f9..a282e13a 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Domain.Shared/Yi.Abp.Domain.Shared.csproj +++ b/Yi.Abp.Net8/src/Yi.Abp.Domain.Shared/Yi.Abp.Domain.Shared.csproj @@ -12,6 +12,9 @@ + + + diff --git a/Yi.Abp.Net8/src/Yi.Abp.Domain.Shared/YiAbpDomainSharedModule.cs b/Yi.Abp.Net8/src/Yi.Abp.Domain.Shared/YiAbpDomainSharedModule.cs index d6728103..bab6b8ef 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Domain.Shared/YiAbpDomainSharedModule.cs +++ b/Yi.Abp.Net8/src/Yi.Abp.Domain.Shared/YiAbpDomainSharedModule.cs @@ -1,4 +1,5 @@ using Volo.Abp.Domain; +using Volo.Abp.SettingManagement; using Yi.Framework.AuditLogging.Domain.Shared; using Yi.Framework.Bbs.Domain.Shared; using Yi.Framework.ChatHub.Domain.Shared; @@ -12,6 +13,7 @@ namespace Yi.Abp.Domain.Shared typeof(YiFrameworkChatHubDomainSharedModule), typeof(YiFrameworkAuditLoggingDomainSharedModule), + typeof(AbpSettingManagementDomainSharedModule), typeof(AbpDddDomainSharedModule))] public class YiAbpDomainSharedModule : AbpModule { diff --git a/Yi.Abp.Net8/src/Yi.Abp.Domain/Yi.Abp.Domain.csproj b/Yi.Abp.Net8/src/Yi.Abp.Domain/Yi.Abp.Domain.csproj index 186560ef..a7e6fbff 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Domain/Yi.Abp.Domain.csproj +++ b/Yi.Abp.Net8/src/Yi.Abp.Domain/Yi.Abp.Domain.csproj @@ -13,11 +13,13 @@ + - + + diff --git a/Yi.Abp.Net8/src/Yi.Abp.Domain/YiAbpDomainModule.cs b/Yi.Abp.Net8/src/Yi.Abp.Domain/YiAbpDomainModule.cs index f405f28a..d49c75ba 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Domain/YiAbpDomainModule.cs +++ b/Yi.Abp.Net8/src/Yi.Abp.Domain/YiAbpDomainModule.cs @@ -7,18 +7,20 @@ using Yi.Framework.Bbs.Domain; using Yi.Framework.ChatHub.Domain; using Yi.Framework.Mapster; using Yi.Framework.Rbac.Domain; +using Yi.Framework.SettingManagement.Domain; using Yi.Framework.TenantManagement.Domain; namespace Yi.Abp.Domain { [DependsOn( typeof(YiAbpDomainSharedModule), - + typeof(YiFrameworkTenantManagementDomainModule), typeof(YiFrameworkRbacDomainModule), typeof(YiFrameworkBbsDomainModule), typeof(YiFrameworkChatHubDomainModule), typeof(YiFrameworkAuditLoggingDomainModule), + typeof(YiFrameworkSettingManagementDomainModule), typeof(YiFrameworkMapsterModule), typeof(AbpDddDomainModule), diff --git a/Yi.Abp.Net8/src/Yi.Abp.SqlSugarCore/Yi.Abp.SqlSugarCore.csproj b/Yi.Abp.Net8/src/Yi.Abp.SqlSugarCore/Yi.Abp.SqlSugarCore.csproj index f943ca62..49a97826 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.SqlSugarCore/Yi.Abp.SqlSugarCore.csproj +++ b/Yi.Abp.Net8/src/Yi.Abp.SqlSugarCore/Yi.Abp.SqlSugarCore.csproj @@ -9,10 +9,12 @@ + + diff --git a/Yi.Abp.Net8/src/Yi.Abp.SqlSugarCore/YiAbpSqlSugarCoreModule.cs b/Yi.Abp.Net8/src/Yi.Abp.SqlSugarCore/YiAbpSqlSugarCoreModule.cs index 71c54e4e..b3e27036 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.SqlSugarCore/YiAbpSqlSugarCoreModule.cs +++ b/Yi.Abp.Net8/src/Yi.Abp.SqlSugarCore/YiAbpSqlSugarCoreModule.cs @@ -8,6 +8,7 @@ using Yi.Framework.ChatHub.SqlSugarCore; using Yi.Framework.CodeGen.SqlSugarCore; using Yi.Framework.Mapster; using Yi.Framework.Rbac.SqlSugarCore; +using Yi.Framework.SettingManagement.SqlSugarCore; using Yi.Framework.SqlSugarCore; using Yi.Framework.SqlSugarCore.Abstractions; using Yi.Framework.TenantManagement.SqlSugarCore; @@ -22,6 +23,7 @@ namespace Yi.Abp.SqlsugarCore typeof(YiFrameworkCodeGenSqlSugarCoreModule), typeof(YiFrameworkChatHubSqlSugarCoreModule), + typeof(YiFrameworkSettingManagementSqlSugarCoreModule), typeof(YiFrameworkAuditLoggingSqlSugarCoreModule), typeof(YiFrameworkTenantManagementSqlSugarCoreModule), typeof(YiFrameworkMapsterModule), diff --git a/Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db b/Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db new file mode 100644 index 0000000000000000000000000000000000000000..929b55f1430dd47d7ec17503ab52ca3bb9e4f76d GIT binary patch literal 487424 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 literal 0 HcmV?d00001