【abp vnext 实战系列】简单的内容管理系统:搭建框架

摘要:
PS:中文文档地址1-生成项目的方式1.1-模板生成地址https://abp.io/get-started1.2-abpcli命令生成https://docs.abp.io/zh-Hans/abp/latest/Getting-Started?UI=MVC&DB=EF&Tiered=No2-项目结构PS:我是纯手工制作,从空白模板开始的2.1-结构如下PS:我不打算用动态API所以结构做了删减G

PS:中文文档地址

1- 生成项目的方式

1.1- 模板生成地址

https://abp.io/get-started

1.2-abp cli 命令生成

https://docs.abp.io/zh-Hans/abp/latest/Getting-Started?UI=MVC&DB=EF&Tiered=No

2-项目结构

PS:我是纯手工制作,从空白模板开始的

2.1-结构如下

PS:我不打算用动态API 所以结构做了删减

【abp vnext 实战系列】简单的内容管理系统:搭建框架第1张

  • GR.CMS.Domain.Shared

我需要审计日志和后台任务功能,所以添加如下引用

Volo.Abp.Validation,

Volo.Abp.AuditLogging.Domain.Shared,

Volo.Abp.BackgroundJobs.Domain.Shared

【abp vnext 实战系列】简单的内容管理系统:搭建框架第2张

【abp vnext 实战系列】简单的内容管理系统:搭建框架第3张【abp vnext 实战系列】简单的内容管理系统:搭建框架第4张
1 [DependsOn(
2           typeof(AbpAuditLoggingDomainSharedModule),
3           typeof(AbpBackgroundJobsDomainSharedModule)
4 )]
5     public classCMSDomainSharedModule : AbpModule
6 {
7         public override voidPreConfigureServices(ServiceConfigurationContext context)
8 {
9 CMSGlobalFeatureConfigurator.Configure();
10 CMSModuleExtensionConfigurator.Configure();
11 }
12 
13         public override voidConfigureServices(ServiceConfigurationContext context)
14 {
15             Configure<AbpVirtualFileSystemOptions>(options =>
16 {
17                 options.FileSets.AddEmbedded<CMSDomainSharedModule>();
18 });
19 
20             Configure<AbpLocalizationOptions>(options =>
21 {
22 options.Resources
23                     .Add<CMSResource>("en")
24                     .AddBaseTypes(typeof(AbpValidationResource))
25                     .AddVirtualJson("/Localization/CMS");
26 
27                 options.DefaultResourceType = typeof(CMSResource);
28 });
29 
30             Configure<AbpExceptionLocalizationOptions>(options =>
31 {
32                 options.MapCodeNamespace("CMS", typeof(CMSResource));
33 });
34 }
35     }
CMSDomainSharedModule

其他类都是照着生成的DEMO 扣的

  • GR.CMS.Domain

添加如下引用

GR.CMS.Domain.Shared,

Volo.Abp.AuditLogging.Domain,

Volo.Abp.BackgroundJobs.Domain

【abp vnext 实战系列】简单的内容管理系统:搭建框架第5张

PS:暂时我不太想要多租户,所以注释了相关配置

1 [DependsOn(
2           typeof(CMSDomainSharedModule),
3           typeof(AbpAuditLoggingDomainModule),
4           typeof(AbpBackgroundJobsDomainModule)
5 )]
6     public classCMSDomainModule : AbpModule
7 {
8         public override voidConfigureServices(ServiceConfigurationContext context)
9 {
10             //Configure<AbpMultiTenancyOptions>(options =>
11             //{
12             //options.IsEnabled = MultiTenancyConsts.IsEnabled;
13             //});
14 
15 #if DEBUG
16             //context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
17 #endif
18 }
19     }
  • GR.CMS.Application.Contracts

添加如下引用

GR.CMS.Domain.Shared,

【abp vnext 实战系列】简单的内容管理系统:搭建框架第6张

1 [DependsOn(
2              typeof(CMSDomainSharedModule)
3 )]
4     public classCMSApplicationContractsModule : AbpModule
5 {
6     }
  • GR.CMS.Application

添加如下引用

GR.CMS.Domain.Shared,

GR.CMS.Application.Contracts

【abp vnext 实战系列】简单的内容管理系统:搭建框架第7张

1 [DependsOn(
2              typeof(CMSApplicationContractsModule),
3              typeof(CMSDomainModule)
4 )]
5     public classCMSApplicationModule : AbpModule
6 {
7     }
  • GR.CMS.EntityFrameworkCore

添加如下引用

GR.CMS.Domain,

Volo.Abp.EntityFrameworkCore.MySQL,

Volo.Abp.AuditLogging.EntityFrameworkCore,

Volo.Abp.BackgroundJobs.EntityFrameworkCore

【abp vnext 实战系列】简单的内容管理系统:搭建框架第8张

【abp vnext 实战系列】简单的内容管理系统:搭建框架第9张【abp vnext 实战系列】简单的内容管理系统:搭建框架第10张
1 [DependsOn(
2           typeof(CMSDomainModule), 
3           typeof(AbpEntityFrameworkCoreMySQLModule),
4           typeof(AbpAuditLoggingEntityFrameworkCoreModule),
5           typeof(AbpBackgroundJobsEntityFrameworkCoreModule)
6 )]
7     public classCMSEntityFrameworkCoreModule : AbpModule
8 {
9         public override voidPreConfigureServices(ServiceConfigurationContext context)
10 {
11 CMSEfCoreEntityExtensionMappings.Configure();
12 }
13 
14         public override voidConfigureServices(ServiceConfigurationContext context)
15 {
16             context.Services.AddAbpDbContext<CMSDbContext>(options =>
17 {
18                 /*Remove "includeAllEntities: true" to create
19 * default repositories only for aggregate roots */
20                 options.AddDefaultRepositories(includeAllEntities: true);
21 });
22 
23             Configure<AbpDbContextOptions>(options =>
24 {
25                 /*The main point to change your DBMS.
26 * See also CMSMigrationsDbContextFactory for EF Core tooling. */
27 options.UseMySQL();
28 });
29 }
30     }
CMSEntityFrameworkCoreModule
  • GR.CMS.Web

添加如下引用

GR.CMS.Application,

GR.CMS.EntityFrameworkCore,

Volo.Abp.AspNetCore.Mvc,

Volo.Abp.Autofac,

Volo.Abp.BackgroundJobs.EntityFrameworkCore,

Serilog.AspNetCore,

Serilog.Sinks.Async,

Volo.Abp.AspNetCore.Serilog

【abp vnext 实战系列】简单的内容管理系统:搭建框架第11张

【abp vnext 实战系列】简单的内容管理系统:搭建框架第12张【abp vnext 实战系列】简单的内容管理系统:搭建框架第13张
1 [DependsOn(
2         typeof(CMSApplicationModule),
3         typeof(CMSEntityFrameworkCoreModule),
4         typeof(AbpAspNetCoreMvcModule),
5         typeof(AbpAutofacModule))]
6     public classCMSWebModule : AbpModule
7 {
8         public override voidPreConfigureServices(ServiceConfigurationContext context)
9 {
10             context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
11 {
12 options.AddAssemblyResource(
13                     typeof(CMSResource),
14                     typeof(CMSDomainModule).Assembly,
15                     typeof(CMSDomainSharedModule).Assembly,
16                     typeof(CMSApplicationModule).Assembly,
17                     typeof(CMSApplicationContractsModule).Assembly,
18                     typeof(CMSWebModule).Assembly
19 );
20 });
21 }
22 
23         public override voidConfigureServices(ServiceConfigurationContext context)
24 {
25             var hostingEnvironment =context.Services.GetHostingEnvironment();
26             var configuration =context.Services.GetConfiguration();
27 
28 ConfigureUrls(configuration);
29              
30 ConfigureAutoMapper();
31 ConfigureVirtualFileSystem(hostingEnvironment);
32 ConfigureLocalizationServices();
33              
34 ConfigureAutoApiControllers();
35              
36 }
37 
38         private voidConfigureUrls(IConfiguration configuration)
39 {
40             Configure<AppUrlOptions>(options =>
41 {
42                 options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
43 });
44 }
45 
46         
47 
48         private voidConfigureAutoMapper()
49 {
50             Configure<AbpAutoMapperOptions>(options =>
51 {
52                 options.AddMaps<CMSWebModule>();
53 });
54 }
55 
56         private voidConfigureVirtualFileSystem(IWebHostEnvironment hostingEnvironment)
57 {
58             if(hostingEnvironment.IsDevelopment())
59 {
60                 Configure<AbpVirtualFileSystemOptions>(options =>
61 {
62                     options.FileSets.ReplaceEmbeddedByPhysical<CMSDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}GR.CMS.Domain.Shared"));
63                     options.FileSets.ReplaceEmbeddedByPhysical<CMSDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}GR.CMS.Domain"));
64                     options.FileSets.ReplaceEmbeddedByPhysical<CMSApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}GR.CMS.Application.Contracts"));
65                     options.FileSets.ReplaceEmbeddedByPhysical<CMSApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}GR.CMS.Application"));
66                     options.FileSets.ReplaceEmbeddedByPhysical<CMSWebModule>(hostingEnvironment.ContentRootPath);
67 });
68 }
69 }
70 
71         private voidConfigureLocalizationServices()
72 {
73             Configure<AbpLocalizationOptions>(options =>
74 {
75                 options.Languages.Add(new LanguageInfo("en", "en", "English"));  
76                 options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
77                 options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
78 });
79 }
80 
81        
82 
83         private voidConfigureAutoApiControllers()
84 {
85             Configure<AbpAspNetCoreMvcOptions>(options =>
86 {
87                 options.ConventionalControllers.Create(typeof(CMSApplicationModule).Assembly);
88 });
89 }
90 
91         
92 
93         public override voidOnApplicationInitialization(ApplicationInitializationContext context)
94 {
95             var app =context.GetApplicationBuilder();
96             var env =context.GetEnvironment();
97 
98             if(env.IsDevelopment())
99 {
100 app.UseDeveloperExceptionPage();
101 }
102 
103 app.UseAbpRequestLocalization();
104 
105            
106 app.UseCorrelationId();
107 app.UseStaticFiles();
108 app.UseRouting();
109 app.UseAuthentication();
110            
111 app.UseUnitOfWork();
112             
113 app.UseAuthorization();
114              
115 app.UseAuditing();
116 app.UseAbpSerilogEnrichers();
117 app.UseConfiguredEndpoints();
118 }
119     }
CMSWebModule

PS: 这样子,基本的架子就搭建成功了,然后运行的时候因为没有生成相关数据库,所以会有错误日志输出

PS:文档地址

免责声明:文章转载自《【abp vnext 实战系列】简单的内容管理系统:搭建框架》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇新安装ubuntu系统的简单优化实战|手把手教你如何使用抓包神器MitmProxy下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android TextView实现跑马灯

TextView实现跑马灯的效果:例子一: 这个例子可以解决给一个TextView实现跑马灯的效果,但是不能解决给所有的TextView实现跑马灯的效果。 <TextView android:layout_width="wrap_content" android:layout_height="wrap_conten...

WPF 2D绘图(3)PathGeometry

PathGeometry可以创建任意的2D图形形状。 其内部通过PathSegment集合来实现 如画2个三角形 <Path Stroke="Black" StrokeThickness="1"> <Path.Data> <PathGeometry>...

移花接木:借助 IViewLocationExpander 更换 ASP.NET Core View Component 视图路径

端午节在家将一个 asp.net 项目向 asp.net core 迁移时遇到了一个问题,用 view component 取代 Html.RenderAction 之后,运行时 view component 找不到视图文件。 System.InvalidOperationException: The view 'Components/AggSitePos...

Java(多)线程中注入Spring的Bean

问题说明 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入,bean对象的值为null。 原因分析 web容器在启动应用时,并没有提前将线程中的bean注入(在线程启动前,web容易也是无法感知的) 解决方案 方法有...

Android自定义控件(二)

这一篇主要来讲一下自定义控件中的自定义viewgroup,我们以项目中最常用的下拉刷新和加载更多组件为例 简单介绍一下自定义viewgroup时应该怎么做。 分析:下拉刷新和加载更多的原理和步骤 自定义一个viewgroup,将headerview、contentview和footerview从上到下依次布局,然后在初始化的时候 通过Scrooller滚动...

Android中对内存和外存的读写

首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。 public void save(){try {FileOutputStream outStream=this.openFileOutput(“a.txt”,Contex...