久久96国产精品久久久-久久发布国产伦子伦精品-久久精品国产精品青草-久久天天躁夜夜躁狠狠85麻豆

技術員聯盟提供win764位系統下載,win10,win7,xp,裝機純凈版,64位旗艦版,綠色軟件,免費軟件下載基地!

當前位置:主頁 > 教程 > 服務器類 >

ZKEACMS for .Net Core深度解析教程

來源:技術員聯盟┆發布時間:2017-08-27 06:13┆點擊:

ZKEACMS.Core 是基于 .Net Core MVC 開發的開源CMS。ZKEACMS可以讓用戶自由規劃頁面布局,使用可視化編輯設計“所見即所得”,直接在頁面上進行拖放添加內容。

ZKEACMS使用插件式設計,模塊分離,通過橫向擴展來豐富CMS的功能。

響應式設計

ZKEACMS使用Bootstrap3的柵格系統來實現響應式設計,從而實現在不同的設備上都可以正常訪問。同時站在Bootstrap巨人的肩膀上,有豐富的主題資源可以使用。

簡單演示

ZKEACMS for .Net Core深度解析教程 三聯

接下來看看程序設計及原理

項目結構

EasyFrameWork  底層框架

ZKEACMS   CMS核心

ZKEACMS.Article   文章插件

ZKEACMS.Product  產品插件

ZKEACMS.SectionWidget  模板組件插件

ZKEACMS.WebHost 

原理 - 訪問請求流程

路由在ZKEACMS里面起到了關鍵性的作用,通過路由的優先級來決定訪問的流程走向,如果找到匹配的路由,則優先走該路由對應的 Controller -> Action -> View,如果沒有匹配的路由,則走路由優先權最低的“全捕捉”路由來處理用戶的請求,最后返回響應。

優先級最低的“全捕捉”路由是用來處理用戶自行創建的頁面的。當請求進來時,先去數據庫中查找是否存在該頁面,不存在則返回404。找到頁面之后,再找出這個頁面所有的組件、內容,然后統一調用各個組件的“Display"方法來來得到對應的“ViewModel"和視圖"View",最后按照頁面的布局來顯示。

ZKEACMS 請求流程圖

ZKEACMS for .Net Core深度解析教程

驅動頁面組件:

widgetService.GetAllByPage(filterContext.HttpContext.RequestServices, page).Each(widget => { if (widget != null) { IWidgetPartDriver partDriver = widget.CreateServiceInstance(filterContext.HttpContext.RequestServices); WidgetViewModelPart part = partDriver.Display(widget, filterContext); lock (layout.ZoneWidgets) { if (layout.ZoneWidgets.ContainsKey(part.Widget.ZoneID)) { layout.ZoneWidgets[part.Widget.ZoneID].TryAdd(part); } else { layout.ZoneWidgets.Add(part.Widget.ZoneID, new WidgetCollection { part }); } } partDriver.Dispose(); } });

頁面呈現:

foreach (var widgetPart in Model.ZoneWidgets[zoneId].OrderBy(m => m.Widget.Position).ThenBy(m => m.Widget.WidgetName)) { <div style="@widgetPart.Widget.CustomStyle"> <div class="widget @widgetPart.Widget.CustomClass"> @if (widgetPart.Widget.Title.IsNotNullAndWhiteSpace()) { <div class="panel panel-default"> <div class="panel-heading"> @widgetPart.Widget.Title </div> <div class="panel-body"> @Html.DisPlayWidget(widgetPart) </div> </div> } else { @Html.DisPlayWidget(widgetPart) } </div> </div> }

插件“最關鍵”的類 PluginBase

每一個插件/模塊都必需要一個類繼承PluginBase,作為插件初始化的入口,程序在啟動的時候,會加載這些類并作一些關鍵的初始化工作。

public abstract class PluginBase : ResourceManager, IRouteRegister, IPluginStartup { public abstract IEnumerable<RouteDescriptor> RegistRoute(); //注冊該插件所需要的路由 可返回空 public abstract IEnumerable<AdminMenu> AdminMenu(); //插件在后端提供的菜單 可返回空 public abstract IEnumerable<PermissionDescriptor> RegistPermission(); //注冊插件的權限 public abstract IEnumerable<Type> WidgetServiceTypes(); //返回該插件中提供的所有組件的類型 public abstract void ConfigureServices(IServiceCollection serviceCollection); //IOC 注冊對應的接口與實現 public virtual void InitPlug(); //初始化插件,在程序啟動時調用該方法 }

具體實現可以參考“文章”插件 ArticlePlug.cs 或者“產品”插件 ProductPlug.cs 

加載插件 Startup.cs

public void ConfigureServices(IServiceCollection services) { services.UseEasyFrameWork(Configuration).LoadEnablePlugins(plugin => { var cmsPlugin = plugin as PluginBase; if (cmsPlugin != null) { cmsPlugin.InitPlug(); } }, null); }

組件構成

一個頁面,由許多的組件構成,每個組件都可以包含不同的內容(Content),像文字,圖片,視頻等,內容由組件決定,呈現方式由組件的模板(View)決定。

關系與呈現方式大致如下圖所示:

ZKEACMS for .Net Core深度解析教程

實體 Enity

每個組件都會對應一個實體,用于存儲與該組件相關的一些信息。實體必需繼承于 BasicWidget 類。

例如HTML組件的實體類: