chore:banner添加种子数据

This commit is contained in:
橙子
2023-12-15 23:44:35 +08:00
parent 5a546cbbd0
commit a03a7162dd
50 changed files with 1104 additions and 9357 deletions
@@ -1,11 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.AspNetCore
namespace Yi.Framework.AspNetCore
{
[Serializable]
public class RemoteServiceSuccessInfo
@@ -15,7 +8,6 @@ namespace Yi.Framework.AspNetCore
/// </summary>
public RemoteServiceSuccessInfo()
{
}
/// <summary>
@@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using Yi.Framework.Bbs.Domain.Entities;
using Yi.Framework.Rbac.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.Bbs.SqlSugarCore.DataSeeds
{
public class BannerDataSeed : IDataSeedContributor, ITransientDependency
{
private ISqlSugarRepository<BannerEntity> _repository;
public BannerDataSeed(ISqlSugarRepository<BannerEntity> repository)
{
_repository = repository;
}
public async Task SeedAsync(DataSeedContext context)
{
if (!await _repository.IsAnyAsync(x => true))
{
await _repository.InsertManyAsync(GetSeedData());
}
}
public List<BannerEntity> GetSeedData()
{
//这里临时使用了图床,图床地址:https://mjj.today/
List<BannerEntity> entities = new List<BannerEntity>()
{
new BannerEntity{
Name="欢迎",
Logo="https://i.miji.bid/2023/12/15/e6478d5d15a4b941077e336790c414f6.png",
Color=""
},
new BannerEntity{
Name="前端",
Logo="https://i.miji.bid/2023/12/15/07e9291c9311889a31a2b433d4decca0.jpeg",
Color=""
},
};
return entities;
}
}
}
@@ -186,6 +186,7 @@ namespace Yi.Framework.Rbac.Application.Services
return await MapToGetOutputDtoAsync(entity);
}
[OperLog("删除用户", OperEnum.Delete)]
[Permission("system:user:delete")]
public override async Task DeleteAsync(Guid id)
{
await base.DeleteAsync(id);
@@ -8,4 +8,9 @@
<ProjectReference Include="..\Yi.Abp.Domain.Shared\Yi.Abp.Domain.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Dtos\" />
<Folder Include="IServices\" />
</ItemGroup>
</Project>
@@ -1,6 +1,7 @@
using Volo.Abp.Application.Services;
using Volo.Abp.DependencyInjection;
namespace Yi.Abp.Application
namespace Yi.Abp.Application.Services
{
public class TestService : ApplicationService
{
@@ -13,4 +13,9 @@
<ProjectReference Include="..\Yi.Abp.Domain\Yi.Abp.Domain.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Jobs\" />
<Folder Include="EventHandlers\" />
</ItemGroup>
</Project>
@@ -10,4 +10,11 @@
<ProjectReference Include="..\..\module\rbac\Yi.Framework.Rbac.Domain.Shared\Yi.Framework.Rbac.Domain.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Consts\" />
<Folder Include="Dtos\" />
<Folder Include="Enums\" />
<Folder Include="Etos\" />
</ItemGroup>
</Project>
@@ -14,4 +14,10 @@
<ProjectReference Include="..\Yi.Abp.Domain.Shared\Yi.Abp.Domain.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Entities\" />
<Folder Include="Managers\" />
<Folder Include="Repositories\" />
</ItemGroup>
</Project>
@@ -9,4 +9,9 @@
<ProjectReference Include="..\Yi.Abp.Domain\Yi.Abp.Domain.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="DataSeeds\" />
<Folder Include="Repositories\" />
</ItemGroup>
</Project>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+194 -84
View File
@@ -1,84 +1,194 @@
2023-12-15 00:10:51.343 +08:00 [INF] Yi框架-Abp.vNext,启动!
2023-12-15 00:10:57.118 +08:00 [INF] Loaded ABP modules:
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Abp.Web.YiAbpWebModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Abp.SqlsugarCore.YiAbpSqlSugarCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Abp.Domain.YiAbpDomainModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Abp.Domain.Shared.YiAbpDomainSharedModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Rbac.Domain.Shared.YiFrameworkRbacDomainSharedModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Data.AbpDataModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Mapster.YiFrameworkMapsterModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Core.YiFrameworkCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Bbs.Domain.Shared.YiFrameworkBbsDomainSharedModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Rbac.Domain.YiFrameworkRbacDomainModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.AspNetCore.SignalR.AbpAspNetCoreSignalRModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Bbs.Domain.YiFrameworkBbsDomainModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Rbac.SqlSugarCore.YiFrameworkRbacSqlSugarCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.SqlSugarCore.YiFrameworkSqlSugarCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Bbs.SqlSugarCore.YiFrameworkBbsSqlSugarCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Abp.Application.YiAbpApplicationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Abp.Application.Contracts.YiAbpApplicationContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Rbac.Application.Contracts.YiFrameworkRbacApplicationContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Ddd.Application.Contracts.YiFrameworkDddApplicationContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Bbs.Application.Contracts.YiFrameworkBbsApplicationContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Rbac.Application.YiFrameworkRbacApplicationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Ddd.Application.YiFrameworkDddApplicationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.BackgroundWorkers.Quartz.AbpBackgroundWorkersQuartzModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Quartz.AbpQuartzModule
2023-12-15 00:10:57.120 +08:00 [INF] - Yi.Framework.Bbs.Application.YiFrameworkBbsApplicationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.UI.AbpUiModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule
2023-12-15 00:10:57.120 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule
2023-12-15 00:10:57.121 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule
2023-12-15 00:10:57.121 +08:00 [INF] - Volo.Abp.AspNetCore.Authentication.JwtBearer.AbpAspNetCoreAuthenticationJwtBearerModule
2023-12-15 00:10:57.121 +08:00 [INF] - Yi.Framework.AspNetCore.YiFrameworkAspNetCoreModule
2023-12-15 00:10:58.044 +08:00 [INF] User profile is available. Using 'C:\Users\45431\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
2023-12-15 00:10:58.208 +08:00 [INF] Initialized all ABP modules.
2023-12-15 00:10:58.431 +08:00 [INF] Now listening on: http://[::]:19001
2023-12-15 00:10:58.431 +08:00 [INF] Application started. Press Ctrl+C to shut down.
2023-12-15 00:10:58.431 +08:00 [INF] Hosting environment: Development
2023-12-15 00:10:58.431 +08:00 [INF] Content root path: D:\CSharp\Yi\Yi.Abp.Net8\src\Yi.Abp.Web
2023-12-15 23:39:44.805 +08:00 [INF] Yi框架-Abp.vNext,启动!
2023-12-15 23:39:50.595 +08:00 [INF] Loaded ABP modules:
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Abp.Web.YiAbpWebModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Abp.SqlsugarCore.YiAbpSqlSugarCoreModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Abp.Domain.YiAbpDomainModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Abp.Domain.Shared.YiAbpDomainSharedModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Rbac.Domain.Shared.YiFrameworkRbacDomainSharedModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Data.AbpDataModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Mapster.YiFrameworkMapsterModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Core.YiFrameworkCoreModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Bbs.Domain.Shared.YiFrameworkBbsDomainSharedModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Rbac.Domain.YiFrameworkRbacDomainModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.AspNetCore.SignalR.AbpAspNetCoreSignalRModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Bbs.Domain.YiFrameworkBbsDomainModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Rbac.SqlSugarCore.YiFrameworkRbacSqlSugarCoreModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.SqlSugarCore.YiFrameworkSqlSugarCoreModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Bbs.SqlSugarCore.YiFrameworkBbsSqlSugarCoreModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Abp.Application.YiAbpApplicationModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Abp.Application.Contracts.YiAbpApplicationContractsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Rbac.Application.Contracts.YiFrameworkRbacApplicationContractsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Ddd.Application.Contracts.YiFrameworkDddApplicationContractsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Bbs.Application.Contracts.YiFrameworkBbsApplicationContractsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Rbac.Application.YiFrameworkRbacApplicationModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Ddd.Application.YiFrameworkDddApplicationModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.BackgroundWorkers.Quartz.AbpBackgroundWorkersQuartzModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Quartz.AbpQuartzModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.Bbs.Application.YiFrameworkBbsApplicationModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.UI.AbpUiModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule
2023-12-15 23:39:50.596 +08:00 [INF] - Volo.Abp.AspNetCore.Authentication.JwtBearer.AbpAspNetCoreAuthenticationJwtBearerModule
2023-12-15 23:39:50.596 +08:00 [INF] - Yi.Framework.AspNetCore.YiFrameworkAspNetCoreModule
2023-12-15 23:39:51.577 +08:00 [INF] User profile is available. Using 'C:\Users\45431\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
2023-12-15 23:39:51.580 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Dept` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:39:51.698 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Dictionary` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:39:51.710 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `DictionaryType` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:39:51.724 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Menu` WHERE ( `MenuName` = N'系统管理' ) AND ( `IsDeleted` = 0 )
2023-12-15 23:39:51.751 +08:00 [INF] Initialized all ABP modules.
2023-12-15 23:39:51.767 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Post` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:39:51.815 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Role` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:39:51.838 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `User` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:39:51.857 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Banner` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:39:51.902 +08:00 [INF] Now listening on: http://[::]:19001
2023-12-15 23:39:51.902 +08:00 [INF] Application started. Press Ctrl+C to shut down.
2023-12-15 23:39:51.902 +08:00 [INF] Hosting environment: Development
2023-12-15 23:39:51.902 +08:00 [INF] Content root path: D:\CSharp\Yi\Yi.Abp.Net8\src\Yi.Abp.Web
2023-12-15 23:39:51.925 +08:00 [DBG] Yi-SQL执行:INSERT INTO `Banner` (`Id`,`Name`,`Logo`,`Color`,`IsDeleted`,`CreationTime`,`CreatorId`,`LastModifierId`,`LastModificationTime`) VALUES(N'55cde9be-cfdf-c5a8-8ec9-3a0f804f28d5',N'欢迎',N'https://mjj.today/i/8dkmrd',N'',0,'2023-12-15 23:39:51.900',NULL,NULL,NULL), (N'c6315092-1340-7e4c-be36-3a0f804f28e6',N'前端',N'https://mjj.today/i/8dkbGu',N'',0,'2023-12-15 23:39:51.912',NULL,NULL,NULL) ;select @@IDENTITY
2023-12-15 23:39:51.943 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `DictionaryType` WHERE ( `DictType` = N'bbs_type_lable' ) AND ( `IsDeleted` = 0 )
2023-12-15 23:39:51.956 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Menu` WHERE ( `MenuName` = N'BBS' ) AND ( `IsDeleted` = 0 )
2023-12-15 23:39:51.968 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Config` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:42:51.087 +08:00 [INF] Yi框架-Abp.vNext,启动!
2023-12-15 23:42:56.241 +08:00 [INF] Loaded ABP modules:
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Abp.Web.YiAbpWebModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Abp.SqlsugarCore.YiAbpSqlSugarCoreModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Abp.Domain.YiAbpDomainModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Abp.Domain.Shared.YiAbpDomainSharedModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Rbac.Domain.Shared.YiFrameworkRbacDomainSharedModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainSharedModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Data.AbpDataModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Mapster.YiFrameworkMapsterModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Core.YiFrameworkCoreModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Bbs.Domain.Shared.YiFrameworkBbsDomainSharedModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Rbac.Domain.YiFrameworkRbacDomainModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.AspNetCore.SignalR.AbpAspNetCoreSignalRModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Json.AbpJsonAbstractionsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingContractsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Caching.AbpCachingModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Bbs.Domain.YiFrameworkBbsDomainModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Rbac.SqlSugarCore.YiFrameworkRbacSqlSugarCoreModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.SqlSugarCore.YiFrameworkSqlSugarCoreModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Bbs.SqlSugarCore.YiFrameworkBbsSqlSugarCoreModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Abp.Application.YiAbpApplicationModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Abp.Application.Contracts.YiAbpApplicationContractsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Rbac.Application.Contracts.YiFrameworkRbacApplicationContractsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Ddd.Application.Contracts.YiFrameworkDddApplicationContractsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Bbs.Application.Contracts.YiFrameworkBbsApplicationContractsModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Rbac.Application.YiFrameworkRbacApplicationModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Ddd.Application.YiFrameworkDddApplicationModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.BackgroundWorkers.Quartz.AbpBackgroundWorkersQuartzModule
2023-12-15 23:42:56.242 +08:00 [INF] - Volo.Abp.Quartz.AbpQuartzModule
2023-12-15 23:42:56.242 +08:00 [INF] - Yi.Framework.Bbs.Application.YiFrameworkBbsApplicationModule
2023-12-15 23:42:56.243 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule
2023-12-15 23:42:56.243 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule
2023-12-15 23:42:56.243 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule
2023-12-15 23:42:56.243 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule
2023-12-15 23:42:56.243 +08:00 [INF] - Volo.Abp.UI.AbpUiModule
2023-12-15 23:42:56.243 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule
2023-12-15 23:42:56.243 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule
2023-12-15 23:42:56.243 +08:00 [INF] - Volo.Abp.Swashbuckle.AbpSwashbuckleModule
2023-12-15 23:42:56.243 +08:00 [INF] - Volo.Abp.AspNetCore.Serilog.AbpAspNetCoreSerilogModule
2023-12-15 23:42:56.243 +08:00 [INF] - Volo.Abp.AspNetCore.Authentication.JwtBearer.AbpAspNetCoreAuthenticationJwtBearerModule
2023-12-15 23:42:56.243 +08:00 [INF] - Yi.Framework.AspNetCore.YiFrameworkAspNetCoreModule
2023-12-15 23:42:57.206 +08:00 [INF] User profile is available. Using 'C:\Users\45431\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
2023-12-15 23:42:57.302 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Dept` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:42:57.340 +08:00 [INF] Initialized all ABP modules.
2023-12-15 23:42:57.403 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Dictionary` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:42:57.420 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `DictionaryType` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:42:57.435 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Menu` WHERE ( `MenuName` = N'系统管理' ) AND ( `IsDeleted` = 0 )
2023-12-15 23:42:57.449 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Post` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:42:57.463 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Role` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:42:57.479 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `User` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:42:57.490 +08:00 [INF] Now listening on: http://[::]:19001
2023-12-15 23:42:57.490 +08:00 [INF] Application started. Press Ctrl+C to shut down.
2023-12-15 23:42:57.490 +08:00 [INF] Hosting environment: Development
2023-12-15 23:42:57.490 +08:00 [INF] Content root path: D:\CSharp\Yi\Yi.Abp.Net8\src\Yi.Abp.Web
2023-12-15 23:42:57.497 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Banner` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
2023-12-15 23:42:57.550 +08:00 [DBG] Yi-SQL执行:INSERT INTO `Banner` (`Id`,`Name`,`Logo`,`Color`,`IsDeleted`,`CreationTime`,`CreatorId`,`LastModifierId`,`LastModificationTime`) VALUES(N'36a8208f-cc3e-03b4-9c6a-3a0f8051fded',N'欢迎',N'https://i.miji.bid/2023/12/15/e6478d5d15a4b941077e336790c414f6.png',N'',0,'2023-12-15 23:42:57.524',NULL,NULL,NULL), (N'5e183433-188c-043b-e69e-3a0f8051fdfd',N'前端',N'https://i.miji.bid/2023/12/15/07e9291c9311889a31a2b433d4decca0.jpeg',N'',0,'2023-12-15 23:42:57.536',NULL,NULL,NULL) ;select @@IDENTITY
2023-12-15 23:42:57.566 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `DictionaryType` WHERE ( `DictType` = N'bbs_type_lable' ) AND ( `IsDeleted` = 0 )
2023-12-15 23:42:57.587 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Menu` WHERE ( `MenuName` = N'BBS' ) AND ( `IsDeleted` = 0 )
2023-12-15 23:42:57.602 +08:00 [DBG] Yi-SQL执行:SELECT COUNT(1) FROM `Config` WHERE ( 1 = 1 ) AND ( `IsDeleted` = 0 )
@@ -35,4 +35,8 @@
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="logs\" />
</ItemGroup>
</Project>
+15
View File
@@ -0,0 +1,15 @@
本文档不会涉及过多的复杂的内容,不仅仅是DDD的入门者最佳选择之一,更是Abp.vNext的入门者最佳选择之一
即使只是当演练项目的态度去审视,我也很高兴的希望,你能从这里学习到不同角度下的理解
小说写手
做什么的
开源现状
不忘初心、一切开源,最纯粹的职位.net生态,我不是什么大佬,但有一颗的
兄弟圈
我有一个梦想
@@ -1,6 +1,6 @@
## 它是什么?
YiFramework是一个基于.Net8+Abp.vNext+后端开源框架
YiFramework是一个基于.Net8+Abp.vNext+SqlSugar的DDD领域驱动设计后端开源框架
中文名称:意框架
@@ -9,6 +9,11 @@ YiFramework是一个基于.Net8+Abp.vNext+的后端开源框架
但是,不仅仅是如此
## 它的理念
谁说Abp复杂?谁说DDD难?打破常规,化繁为简,新人入门,项目二开,最佳方式之一
> 一百个人,就有一百种DDD,Yi框架不一定是极度严格的DDD,而是站在巨人的肩膀上,经过极多项目的提炼,摸索出一种最佳实践
优雅的进行快速开发,通常,简单程度与优雅程度不可兼得,Yi框架并不一昧的追求极致的解耦,会站在用户使用角度上,在使用难易度进行考虑衡量
> 一个面向用户的快速开发后端框架
@@ -17,37 +22,21 @@ YiFramework是一个基于.Net8+Abp.vNext+的后端开源框架
## 特点
- 面向用户的后端框架,使用简单,适合小型、中型、企业级项目
- 项目内置源码,不打包,方便二开
- 项目直接内置源码,不打包,非常适合进行二开改造
- 内置包含大量通用场景模块
- 等等
## 基础设施简介
- Jwt鉴权
- 接口级别授权
- 对象映射
- O/RM
- 数据过滤
- 多租户
- 逻辑删除
- 审计日志
- 种子数据
- 工作单元
- 模块化
- 动态Api
- 属性注入
- 自动依赖注入
- 当前用户
- 仓储
- Crud
以下全部功能可直接使用:
- [Abp.vNext官网](https://docs.abp.io/zh-Hans/abp/latest/)
- [SqlSugar官网](https://www.donet5.com/home/doc)
## 内置模块简介
- Rbac权限管理系统
- Bbs论坛社区系统
## 业务项目
- RABC后台管理系统
- BBS社区系统
> 重复的东西,无需再写一遍,这也是优雅的体现之一
@@ -0,0 +1,30 @@
# 后端
C# Asp.NetCore 8.0
- [x] 动态ApiAbp.vNext
- [x] 鉴权授权:Jwt
- [x] 日志:Serilog
- [x] 模块化:Abp.vNext
- [x] 依赖注入:Autofac
- [x] 对象映射:Mapster
- [x] ORM: SqlsugarCore
- [x] 多租户:Abp.vNext
- [x] 后台任务:Quartz.Net
- [x] 本地缓存:Abp.vNext
- [x] 分布式缓存:Abp.vNext
- [x] 事件总线:Abp.vNext
# 前端
js Vue3.2
- [x] 异步请求:axios
- [x] 图表:echarts
- [x] uielement-plus
- [x] 存储:pinia
- [x] 路由:vue-router
- [x] 打包:vite
# 运维
- [x] 部署:nginx
- [x] CICDgitlab+Jenkins
- [x] Dockerharbor
@@ -0,0 +1,46 @@
本项目为前后端分离项目,后端需要.Net8环境启动,前端需Node.js环境启动
推荐下载开发工具:
- Visual Studio 2022
- Visual Studio Core
## 后端
vs选中启动项目Yi.Abp.Web模板项目
![Alt text](../image/web.png)
直接启动即可,无任何其他环境依赖,数据库默认采用`Sqlsite`,缓存默认采用`本地缓存`
启动后,浏览器将会弹出项目接口地址swagger:
![Alt text](../image/swagger.png)
> 纳尼?怎么就看到一个测试接口?莫急,由于模块化方式,接口会越来越多,已自动分组至右上角,请点击分组
恭喜你,已经成功运行后端,是不是很简单?
> 等等?表结构呢?表数据呢?为什么没有sql文件?在这里,统统不需要,配置文件默认开启CodeFirst可自动建库及表结构,默认开启DataSeed种子数据,自动创建初始化数据
## 前端
对于前端,默认提供两个项目,分别对应后端的BBS与RBAC
- BBS -> Yi.BBS.Vue3
- RBAC -> Yi.RuoYi.Vue3
可根据需要选择进行启动
1:还原依赖
> npm install
2:启动项目
> npm run dev
## 配置启动地址:
前端:
![Alt text](../image/feStart.png)
后端:
![Alt text](../image/start.png)
@@ -0,0 +1,104 @@
好了,相信当你非常容易的启动了项目之后,并看到了页面效果,也感受到它的简易
废话少说,直接上图:
![Alt text](../image/code.png)
***感觉和传统的不太一样,怎么这么多类库,感觉很难上手***
NONONONONO!
恰恰相反,其实对于使用用户来说我们只关注src中的Yi.Abp即可,如下图:
项目模板结构:
> 懂Abp.vNext的大佬看到目录就会有一股熟悉的味道
Yi框架并没有直接采用Abp.vNext的模板生成,而是从零进行搭建起来的,但其中的分层结构与Abp.vNext是一致的,只是EntityFramework更换成了SqlSugar
总体来看分为以下3个部分:
- Framework Yi.Framework框架部分,基础设施)
- ModuleYi.Framework提供的内置模块部分,例如Rbac、Bbs)
- Src (真正业务进行开发的部分)
很好,换句话来说,只需要关注Src部分,其他的都以`源代码`的方式,并没有进行打成nuget包,1是为了方便二开,2是为了方便大家学习,3是本来也不复杂
现在,我们来好好见识下为何如此分层吧~
说到分层,不得不提这个经典神图
![Alt text](../image/fenceng.png)
这张图就对应着我们的结构
![Alt text](../image/jiegou.png)
这个可能没接触过DDD的不能理解,为什么要这样分层,三层架构不好吗?这样感觉好难,不能理解!且慢,待你看完下面每层的概述,你就不会认为简单,这不比三层架构简单?
首先,Yi框架的分层非常明确,命名属于严格类型,对于初学者,一眼看破
简单分为6个类库
1. 应用层
2. 应用抽象层
3. 领域层
4. 共享层
5. 基础设施Sqlsugar层
6. Web层
我们从下至上讲解:
## Doman.Shared 共享层
最底层是Doman.Shared,共享层,这里存放各个常量、枚举、不依赖各个模块的通用类:
![Alt text](../image/domanShared.png)
> Doman.Shared,共享层 是一层很简单、不包含业务的模块,让它尽可能简单,有没有感觉像三层架构的Common?
## Domain 领域层
只依赖Doman.Shared的`Domain领域层`
![Alt text](../image/domain.png)
你可以选择存放大部分业务到领域层中,我们称这种模式叫做:`重领域层模式`
你也可以选择存放大部分业务到它的上一层,Application 应用层,叫做:`重应用层模式`
在领域层中,你的实体,以及跟实体相关的设施可在这里
同时你也可以创建领域服务(Managers文件夹中),管理当前子领域的聚合,例如:
> 在学校模块中,包含了学生、教师、教室,为了更加聚合,可在学校模块中创建领域服务
## Application 应用层
接下来,是应用层
![Alt text](../image/application.png)
熟悉的Crud、熟悉的Service,这里可以存放简单的通用业务,例如:Crud
如果是重应用层开发,你完全可以将业务写入到应用层,当一个快乐的三层架构Crud,Boy
另外,关于上次的Job任务调度、事件处理也可以放在这里进行处理
> 简单而优雅~何乐而不为?
## Application.Contracrs 抽象层
Application.Contracrs应用抽象模块,是对应用模块的抽象,它的结构也非常的简单
![Alt text](../image/contracrs.png)
这里有Dtos的概念,不出意外,大部分人已经接触,具体的可以在后续Crud中进行讲解
## SqlSugarCore 数据访问层
![Alt text](../image/sqlsugar.png)
这一层中,依赖领域层,但是不依赖应用层
用于使用Sqlsugar相关的操作,比如`自定义仓储`
但是,其实大部分通用场景,框架内部已经封装,能用到这层的机会都比较少
对复杂的数据访问封装
> 由于Querable对象用起来并没有到达SugarQuerable的爽感,且也不想让每个复杂查询都通过仓储进行扩展,这会导致用户使用感较差,所以经过各类平衡考虑,YiFramework框架与Sqlsugar是有轻量的`耦合性`的,框架提供Sqlsugar抽象层,避免过重的耦合,意味着,你可以在大部分地方使用Sqlsugar的操作,这在真正的业务项目来说,使用非常的方便,与Sqlsugar保持有一致的观念
## Web 层
最后一个同样非常简单的一层
Web模块,它的目的只是利用Asp.NetCore host Web主机,将应用层的业务通过Webapi形式暴露出去而已
![Alt text](../image/webPro.png)
可以看的出,结构很简单,甚至除了启动配置目录,连其他一个额外的目录都没有
> 综上所述,我们的业务,我的开发代码,大部分都在`领域层`与`应用层`
光说不练,源代码直接提供rbac、bbs两大模块,结构是一致的,直接看看依葫芦画瓢不就清楚啦~
@@ -22,39 +22,43 @@ app.UseSqlsugar();
另外,该模块类实现`AbpModule`基类
ConfigureServices:用来配置容器服务
OnApplicationInitialization用来配置管道模型
OnApplicationInitialization:管道模型组装后执行
Abp内置`DependsOn`特性标签,可进行维护各个模块之间的依赖关系
## 完整例子
创建模块化文件:
``` cs
using Volo.Abp.Caching;
using Volo.Abp.Domain;
using Volo.Abp.Modularity;
using Yi.Abp.Domain;
using Yi.Abp.SqlSugarCore;
using Yi.Framework.Bbs.SqlSugarCore;
using Yi.Abp.Domain.Shared;
using Yi.Framework.Bbs.Domain;
using Yi.Framework.Mapster;
using Yi.Framework.Rbac.SqlSugarCore;
using Yi.Framework.SqlSugarCore;
using Yi.Framework.Rbac.Domain;
namespace Yi.Abp.SqlsugarCore
namespace Yi.Abp.Domain
{
[DependsOn(
typeof(YiAbpDomainModule),
typeof(YiAbpDomainSharedModule),
typeof(YiFrameworkRbacSqlSugarCoreModule),
typeof(YiFrameworkBbsSqlSugarCoreModule),
typeof(YiFrameworkRbacDomainModule),
typeof(YiFrameworkBbsDomainModule),
typeof(YiFrameworkMapsterModule),
typeof(YiFrameworkSqlSugarCoreModule)
typeof(AbpDddDomainModule),
typeof(AbpCachingModule)
)]
public class YiAbpSqlSugarCoreModule : AbpModule
public class YiAbpDomainModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
public virtual void ConfigureServices(ServiceConfigurationContext context)
{
}
public virtual void OnPreApplicationInitialization(ApplicationInitializationContext context)
{
context.Services.AddYiDbContext<YiDbContext>();
}
}
}
```
在启动管道模型组装文件使用入口模块:
```
@@ -0,0 +1,60 @@
## 简介
控制器层通常不包含业务的,我们控制器的代码经常是如下:
``` cs
[HttpGet]
[route("Info")]
pulic IActionResult GetInfo()
{
retrun Ok(_service.GetInfo());
}
```
我们不仅要创建控制器文件,还要写出应用层到控制器的方法,将业务的数据通过控制器暴露出去
> 控制器只做转发,没有做任何事情,形成了大量的冗余代码
## 如何使用
> 推荐直接在应用层中直接使用
使用动态Api,需要3个条件
1. 任何一个类,实现`IRemoteService`接口
2. 该类需要加入DI容器
3. 在管道模型中,配置动态Api服务:
> 通常我们直接继承`ApplicationService`即可,因为该类实现了`IRemoteService`
``` cs
//动态Api
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers.Create(typeof(YiAbpApplicationModule).Assembly, options => options.RemoteServiceName = "default");
});
```
根据方法名自动映射Http方法及路由
例如:
- GetInfoGet请求
- UpdateInfoPut请求
- RemoveInfo: Del请求
- CreateInfo: Post请求
## 完整例子
``` cs
using Volo.Abp.Application.Services;
namespace Yi.Abp.Application.Services
{
public class TestService : ApplicationService
{
/// <summary>
/// 你好世界
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public string GetHelloWorld(string? name)
{
return name ?? "HelloWord";
}
}
}
```
@@ -0,0 +1,35 @@
## 简介
熟悉Asp.NetCore的小伙伴们,对依赖注入可太熟悉,这里也不在过多的讲述依赖注入知识
默认内置的注入方式,通常是在启动类文件,一个一个手动注入,例如:
``` cs
service.Addsingle<接口,类>()
```
同样,当服务过多,添加服务的代码会显的非常长,不够优雅
可以使用框架内置的接口
- IScopedDependency
- ISingletonDependency
- ITransientDependency
也可以使用框架内置的特性
- DependencyAttribute
- ExposeServicesAttribute
> 使用特性,可以指定特定类、接口作为抽象
## 如何使用
#### 特性方式:
在实现类上标注特性即可
``` cs
[ExposeServices(typeof(ITestService))]
[Dependency(ServiceLifetime.Transient)]
public class Test
{
}
```
#### 接口方式:
同理,根据不同的接口,选择不同的生命周期,自动会优先找自动以`I+类名`的接口作为抽象
``` cs
public class Test:ITest,ISingletonDependency
{
}
```
@@ -0,0 +1,16 @@
## 简介
默认推荐的构造函数注入,依赖关系会非常明确
但是,会给程序带来大量的重复依赖注入代码,构造函数会非常的冗余
所以,在Abp的中,内置了属性注入方式
> 不是开玩笑,万不得已,最好别用。我也被坑过很多次,带来的弊端也非常明显,难以调试,且依赖关系不清晰,生命周期也是在构造函数之后
## 使用方式
使用极为简单:
``` cs
public IArticleRepository ArticleRepository { get; set; }
```
在具备get与set方法的属性上,打上Autowired特性即可,在该类被注入时候,该属性会在容器中寻找并且赋值
我们的实现方式,是通过AutoFac的模块,你需要在启动的Host中添加autofac的属性注入模块:
``` cs
@@ -0,0 +1,41 @@
## 简介
如何获取当前请求用户信息?这个问题有很多个答案
常规是通过HttpContext对象进行获取,它通常是在ControllerBase中,控制器中内置了HttpContext对象
也可以通过依赖注入HttpContext访问器中获取
> 但是,他们都不够优雅,原因:与HttpContext具备了强耦合,如果对于没有HttpContext,将会非常的难维护,例如:单元测速
你可以依赖注入使用:`ICurrentUser`
它是瞬态注入,但是它能够获取当前作用域的用户信息
## 如何使用
任何地方,依赖注入:`ICurrentUser`
它包含属性:
``` cs
public interface ICurrentUser
{
//是否授权
public bool IsAuthenticated { get; }
//id
public Guid Id { get; }
//用户名
public string UserName { get; }
//租户id
public Guid TenantId { get; }
//邮件
public string Email { get; }
public bool EmailVerified { get; }
//电话
public string PhoneNumber { get; }
public bool PhoneNumberVerified { get; }
//角色codes
public string[]? Roles { get; }
}
```
直接使用即可
> 注意,当前用户功能默认是继承到Core模块,所以你无需进行任何引用,直接使用即可
@@ -0,0 +1,25 @@
## 简介
在C#强大的语法下Orm也是极度的优雅
本框架默认集成Sqlsugar Orm,与YiFramework拥有相同理念
> 从用户体验出发,用起来爽,使用体验极佳
你可以查略 [Sqlsguar官网](https://www.donet5.com/Home/Doc)学习
## 如何使用
默认已经集成SqlSugar模块,可依赖注入`ISqlSugarDbContext`即可,我们称做它为Db,用于操作数据库
> 不推荐直接使用db,大部分的操作数据方式使用仓储完全够用`ISqlSugarRepository<Entity, Guid> repository`或`IRepository<Entity, Guid> repository`
由于Querable对象用起来并没有到达SugarQuerable的爽感,且也不想让每个复杂查询都通过仓储进行扩展,这会导致用户使用感较差
所以经过各类平衡考虑,YiFramework框架与Sqlsugar是有轻量的`耦合性`的,框架提供Sqlsugar抽象层,避免过重的耦合,意味着,你可以在`大部分`地方使用Sqlsugar的操作,这在真正的业务项目来说,使用非常的方便,与Sqlsugar保持有一致的观念
我们已经集成SqlSugarCore模块在Abp.vNext中的
- Crud
- 仓储
- 工作单元
- 审计日志
- 逻辑删除
- 数据过滤
- 领域事件
意味着,可以平滑的直接使用Abp.vNext的这些功能
@@ -0,0 +1,28 @@
## 简介
使用仓储用于操作数据库数据,封装通用增删改查等方式
> `ISqlsugarRepository<TEntity>`仓储内置了Sqlsugar Db,具有一定的强耦合,但是使用起来会非常的舒服方便
** 原因:**Queryable对象是微软内置的查询对象,可以使用linq语法,同时也是为了Efcore的查询对象,Sqlsugar 的查询对象为SugarQueryable对象,两者并不兼容,SugarQueryable的功能远远大与Queryable,为此Sqlsugar不会限制自己而兼容Queryable对象
## 使用方式
方式1:依赖注入`IRepository<TEntity>`接口即可
方式2:依赖注入`IRepository<TEntity,Guid>`接口即可
方式3:依赖注入`ISqlSugarRepository<TEntity>`接口即可
方式4:依赖注入`ISqlSugarRepository<TEntity,Guid>`接口即可
方式5:继承`SqlSugarRepository<TEntity,Guid>`基类,自定义仓储,注入自己的仓储接口,例如写一个`StudentRepository`继承`SqlSugarRepository<TEntity,Guid>`,再实现自己的`IStudentRepository`,后续使用`IStudentRepository`依赖注册进行使用即可
> 推荐简单常用`ISqlSugarRepository<TEntity,Guid>`的注入
`ISqlSugarRepository`内置了非常多的通用数据库操作方法,同时也内置了`ISqlsugarClient`Db对象在其中
内置方法非常多
- 查询
- 删除
- 修改
- 添加
- 分页查询
- Db对象
@@ -0,0 +1,56 @@
## 简介
> 想做一个快乐的Crud boy??好,满足你
可能绝大部分简单的业务,真的只是不用类型的Crud,大量的重复代码,使用cv方式,不够优雅
框架内部内部封装各种场景下的crud
## 使用
在应用层继承`YiCrudAppService`crud服务即可
在这之前,你应该先了解各个dto的作用:
> 注意,我们当然可以直接使用Abp中的`CrudAppService`,但由于Abp内置的Crud还缺少一些常用的接口,比如批量删除等方式,所以推荐使用`YiCrudAppService`,使用上完全没有区别
``` cs
- TGetOutputDto (单查返回的dto)
- TGetListOutputDto (多查返回的dto)
- TGetListInput (多查的条件)
- TCreateInput (创建的dto)
- TUpdateInput (更新的dto
```
根据Dto业务场景,它有很多种选项,依次为:
``` cs
- YiCrudAppService<TEntity, TEntityDto, TKey>
- YiCrudAppService<TEntity, TEntityDto, TKey, TGetListInput>
- YiCrudAppService<TEntity, TEntityDto, TKey, TGetListInput, TCreateInput>
- YiCrudAppService<TEntity, TEntityDto, TKey, TGetListInput, TCreateInput, TUpdateInput>
- YiCrudAppService<TEntity, TGetOutputDto, TGetListOutputDto, TKey, TGetListInput, TCreateInput, TUpdateInput>
```
dto可以放到`Application.Contracts`层,同理接口继承`IYiCrudAppService`即可
```cs
- YiCrudAppService<TEntityDto, TKey>
- YiCrudAppService<TEntityDto, TKey, TGetListInput>
- YiCrudAppService<TEntityDto, TKey, TGetListInput, TCreateInput>
- YiCrudAppService<TEntityDto, TKey, TGetListInput, TCreateInput, TUpdateInput>
- YiCrudAppService<TGetOutputDto, TGetListOutputDto, TKey, TGetListInput, TCreateInput, TUpdateInput>
```
> 可以发现,接口,不应该与实体有直接关系
其中,在YiCrudAppService中,我们提供了一些内置的方法:
```cs
public virtual async Task<TGetOutputDto> CreateAsync(TCreateInput input)
public virtual async Task<bool> DeleteAsync(string id)
public virtual async Task<TGetOutputDto> UpdateAsync(TKey id, TUpdateInput input)
public virtual async Task<TGetOutputDto> GetAsync(TKey id)
public virtual async Task<PagedResultDto<TGetListOutputDto>> GetListAsync(TGetListInput input)
```
同时还有映射关系:
``` cs
protected virtual Task<TGetOutputDto> MapToGetOutputDtoAsync(TEntity entity)
protected virtual Task<List<TGetListOutputDto>> MapToGetListOutputDtosAsync(List<TEntity> entities)
protected virtual Task<TGetListOutputDto> MapToGetListOutputDtoAsync(TEntity entity)
protected virtual Task<TGetOutputDto> MapToGetOutputDtoAsync(TEntity entity)
protected virtual Task<List<TGetListOutputDto>> MapToGetListOutputDtosAsync(List<TEntity> entities)
protected virtual Task<TGetListOutputDto> MapToGetListOutputDtoAsync(TEntity entity)
```
另外,它也提供了对应的`仓储`及`当前用户`等常用属性
@@ -0,0 +1,42 @@
## 简介
审计日志是对数据的操作记录
例如:
1. 数据的创建者
2. 数据的创建时间
3. 数据的更新者
4. 数据的更新时间
对于重要的数据,我们应该提供审计日志功能,方便进行数据追溯
框架内部已`自动集成`,使用起来非常简单
## 如何使用
我们把全部的审计日志封装一个对象
你的**实体**可直接继继承或者实现接口
AuditedObject与IAuditedObject
它包含4个属性字段,
``` cs
public DateTime CreationTime { get; set; }= DateTime.Now;
public Guid? CreatorId { get; set; }
public Guid? LastModifierId { get; set; }
public DateTime? LastModificationTime { get; set; }
```
**在执行插入的时候:**
会自动为`CreationTime` 与 `CreatorId` 赋值
**在执行更新的时候:**
会自动为`LastModificationTime` 与 `LastModifierId` 赋值
当然,如果只需要部分的审计日志,你完全可以实现单独的接口
分别为:
``` cs
IHasCreationTime
IMayHaveCreator
IModificationAuditedObject
IHasModificationTime
```
@@ -0,0 +1,47 @@
## 简介
> 工作单元模式是“维护一个被业务事务影响的对象列表,协调变化的写入和并发问题的解决”
它的作用
1. 事务相关
2. 共用连接
...
## 如何使用
依赖注入`IUnitOfWorkManager`,使用`CreateContext`创建一个`IUnitOfWork`工作单元
在工作单元内部,可提交,回滚,获取仓储
``` cs
bool IsTran { get; set; }
bool IsCommit { get; set; }
bool IsClose { get; set; }
IRepository<T> GetRepository<T>();
bool Commit();
```
> 注意,在除Get请求上,其他请求默认都开启了工作单元(post、put、delelte
## 完整例子
``` cs
private IUnitOfWorkManager _unitOfWorkManager { get; set; }
public void Test()
{
using (var uow = _unitOfWorkManager.CreateContext())
{
//仓储执行各种操作
//统一提交
uow.Commit();
}
}
```
## 特性方式
还可以通过`[UnitOfWork]`特性,打在方法上,该方法便会当作一个事务进行提交
``` cs
[UnitOfWork]
public void Test()
{
//仓储执行各种操作
}
```
@@ -0,0 +1,92 @@
## 简介
种子数据一直都是一个很繁琐的东西,例如在初始化数据的时候,添加默认用户
可以通过导入sql的方式进行添加种子数据,也可以通过程序代码中自动初始化数据
我们目前提供后者
## 如何使用
一切的根源,来源自:`IDataSeedContributor`
直接使用实现`IDataSeedContributor`接口,我们只需要实现 `SeedAsync(DataSeedContext context)`即可
在实现类上,要将该类加入容器中,推荐通过内置的依赖注入模块
当然,对于扩展,你可以重写其他的方法
#### 其他方式使用
另外,你可以直接依赖注入,直接使用IDataSeeder SeedAsync方法,重新手动执行种子数据
> 默认在程序启动的时候,会根据配置文件选择,是否执行种子数据
## 完整例子
``` cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlSugar;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Guids;
using Yi.Framework.Rbac.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.Bbs.SqlSugarCore.DataSeeds
{
public class ConfigDataSeed : IDataSeedContributor, ITransientDependency
{
private ISqlSugarRepository<ConfigEntity> _repository;
public ConfigDataSeed(ISqlSugarRepository<ConfigEntity> repository)
{
_repository = repository;
}
public async Task SeedAsync(DataSeedContext context)
{
if (!await _repository.IsAnyAsync(x => true))
{
await _repository.InsertManyAsync(GetSeedData());
}
}
public List<ConfigEntity> GetSeedData()
{
List<ConfigEntity> entities = new List<ConfigEntity>();
ConfigEntity config1 = new ConfigEntity()
{
ConfigKey = "bbs.site.name",
ConfigName = "站点名称",
ConfigValue = "意社区"
};
entities.Add(config1);
ConfigEntity config2 = new ConfigEntity()
{
ConfigKey = "bbs.site.author",
ConfigName = "站点作者",
ConfigValue = "橙子"
};
entities.Add(config2);
ConfigEntity config3 = new ConfigEntity()
{
ConfigKey = "bbs.site.icp",
ConfigName = "站点Icp备案",
ConfigValue = "赣ICP备20008025号"
};
entities.Add(config3);
ConfigEntity config4 = new ConfigEntity()
{
ConfigKey = "bbs.site.bottom",
ConfigName = "站点底部信息",
ConfigValue = "你好世界"
};
entities.Add(config4);
return entities;
}
}
}
```
@@ -0,0 +1,80 @@
## 简介
> 鉴权是用于解析用户的令牌,知道用户是否携带令牌,并且知道用户信息是谁
改鉴权使用的是微软Asp.NetCore扩鉴权扩展方式
程序模块已内置
``` cs
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ClockSkew = TimeSpan.Zero,
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtOptions.Issuer,
ValidAudience = jwtOptions.Audience,
RequireExpirationTime = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtOptions.SecurityKey))
};
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
if (!string.IsNullOrEmpty(accessToken))
{
context.Token = accessToken;
}
return Task.CompletedTask;
}
};
});
```
## 如何使用
默认已经集成,所以在使用方面,可要求客户端添加标准的jwtbear头即可
swagger 接口文档中,已集成,直接输入jwttoken即可
![Alt text](../image/swaggerIndex.png)
我们采用的是HSA对称加密方式,只需要具备密钥
对应的配置文件
``` json
//鉴权
"JwtOptions": {
"Issuer": "https://ccnetcore.com",
"Audience": "https://ccnetcore.com",
"SecurityKey": "zqxwcevrbtnymu312412ihe9rfwhe78rh23djoi32hrui3ryf9e8wfh34iuj54y0934uti4h97fgw7hf97wyh8yy69520",
"ExpiresMinuteTime": 86400
}
```
## Token如何来
那肯定是登录啊,登录接口会返回Token
那如何制作Token?直接上代码,下面这个也是登录的创建token的方式
``` cs
/// <summary>
/// 创建令牌
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
private string CreateToken(Dictionary<string, object> dic)
{
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtOptions.SecurityKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var claims = dic.Select(x => new Claim(x.Key, x.Value.ToString())).ToList();
var token = new JwtSecurityToken(
issuer: _jwtOptions.Issuer,
audience: _jwtOptions.Audience,
claims: claims,
expires: DateTime.Now.AddSeconds(_jwtOptions.ExpiresMinuteTime),
notBefore: DateTime.Now,
signingCredentials: creds);
string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
return returnToken;
}
```
@@ -0,0 +1,18 @@
## 简介
> 授权必须基于鉴权之后,知道了用户的信息,根据用户权限列表进行判断是否有权限进入
框架内部集成授权方式,并非为Asp.netcore授权方式,而是提供一种更简单的方式
使用起来非常简单
## 使用
只需要在需要授权的接口上打上特性 `[Permission("code")]`接口
code为登录时候颁发的token中的权限,如果该用户的token 权限列表中不包含code,将被会拦截,并提示未授权,被拒绝
``` cs
[Permission("system:user:delete")]
public override async Task DeleteAsync(Guid id)
{
await base.DeleteAsync(id);
}
```
@@ -0,0 +1,48 @@
## 简介
当程序出现异常之后,框架需要记录,同时反馈前端对应的信息
它通过`全局错误中间件`实现
错误后,将统一返回以下模型格式:
``` cs
public class RemoteServiceErrorInfo
{
public string? Code { get; set; }
/// <summary>
/// message.
/// </summary>
public string? Message { get; set; }
/// <summary>
/// details.
/// </summary>
public string? Details { get; set; }
/// <summary>
/// data.
/// </summary>
public object? Data { get; set; }
}
```
框架内部错误分为三大类:
#### 系统内部错误
> httpCode500
系统不能处理、或未发现的错误,需要即使进行修复
#### 业务友好错误
> httpCode:403
跟业务相关,业务请求不合理,例如:登录失败、数据重复
#### 授权错误
> httpCode:401
跟权限相关,代表当前用户权限不足
## 使用
你可以在程序任何地方进行抛出错误
``` cs
throw new Exception("系统错误");//状态码500
throw new UserFriendlyException("业务错误");//状态码403
throw new NotImplementedException("未实现");//状态码501
throw new UserFriendlyException("花里胡哨错误","401");//状态码401
```
Abp内部将自动抓取,并返回给前端
@@ -0,0 +1,5 @@
恭喜恭喜,看到了这里,说明你已经掌握了框架最常用的一些基础设施功能
现在你要做到的,是真正编写一个业务,将这些功能进行组合接口
那就万变不离其宗,还是以那个多少人的第一个项目来上手,著名鼎鼎的`图书管理系统`
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB