abp-CMS模塊-廣告


無論是開發app還是網站,可能都需要一個廣告功能,比如我們常見的在首頁有個輪播廣告,里面會輪播顯示多個圖片。還有比如一個新聞門戶網站 很常見的 banner橫幅廣告,還有js特效廣告等。本篇說說在abp(5.9)中如何實現廣告模塊。

源碼地址:https://gitee.com/bxjg1987/abp 基於abp一代5.9版
在線演示:http://git.weilaikj.cn/  賬號密碼 admin  123qwe

廣告位

它代表某個頁面上,某個位置,比如:首頁頂部用來放輪播廣告那個位置。再比如:新聞列表頁右側廣告位。廣告位有個名字屬性,還有尺寸相關的屬性

廣告控件

它是在頁面用來展示廣告的頁面組件定義,比如:圖片輪播控件。再比如:靜態圖片展示控件。

這里的控件只是定義某個控件,在數據庫表中就是一條記錄,定義了控件名、控件類型(輪播、靜態圖、普通文本)、控件參數等屬性。前端可以根據這些數據來定義界面。因為可能有不同的前端,就算同樣是pc網站前端,我也無法限制你將來用什么樣的形式來展現一個輪播圖片的控件。所以我只能把后台定義的輪播圖片控件的相關參數給你,至於如何使用這些參數來顯示輪播控件,只能由你來實現了。

廣告

它就表示一個廣告,這就代表廣告主將來要投放的廣告。比如客戶提供的一張圖片。它有廣告標題、廣告類型(是圖片?文本?一段html?一段js?)廣告內容(比如是圖片類型廣告,則它存儲圖片的url)、URL(點擊廣告時要跳轉到哪去)

廣告發布記錄

它是上面3個概念的多對多關系的建立,它是一條廣告發布記錄。什么時候,發布哪個廣告,使用什么樣的控件,發布到哪幾個廣告位。如:有個圖片廣告 要顯示到 首頁輪播控件中,同時顯示到新聞列表頁右側,用靜態圖片廣告控件展示

廣告 與 廣告發布記錄 合並

目前沒有這樣處理,不過可以說說思路。廣告、廣告位、廣告控件,最后通過廣告發布記錄將它們多對多關聯,這樣的設計非常靈活。但是也相對復雜。可以考慮將廣告和廣告發布記錄合並,這樣就沒那么靈活了,比如同一個廣告要同時發布到多個廣告位(首頁和列表頁和內容頁,甚至是多個欄目的不同位置都有同時顯示某個廣告)。或者同一個廣告要用不同的控件展示時。合並這倆概念要實現前面說的這種需求,就需要將同一個廣告多次發布,其實本質上就是兩個廣告,只是廣告內容一樣

cms模塊中的廣告源碼簡述

首先在CMS/BXJG.CMS.Core/Ad中建立上面各概念對應的實體類:廣告位(AdPositionEntity)、廣告控件(AdControlEntity)、廣告(AdEntity)、廣告發布記錄(AdRecordEntity)等實體

然后在CMS/BXJG.CMS.EFCore/EFMaps中建立相應的ef映射文件 xxMap.cs

然后在CMS/BXJG.CMS.Application/Ad中建立應用服務接口及實現,當然還有對應的dto對象。這里需要注意,系統管理員需要在管理后台對廣告進行管理,比如定義廣告位、對廣告的增、刪、改、查、發布、撤銷等操作。網站或app或小程序前台展示廣告時則是不需要用戶登錄的,匿名用戶應該也可以看到這些廣告。所以這里將 分別定義后台和前端對廣告的處理對應的接口,而不是定義在同一個接口中。具體來說IBXJGCMSFrontAdRecordAppService是專門給前端用的接口,里面只包含對廣告的查詢功能。IBXJGCMSAdAppService則是給后台對廣告進行管理的接口,里面包含對廣告的增、刪、改、查、發布撤銷等,不過寫文章時此接口和實現還沒有做。

下面按abp的套路定義權限和菜單

到此cms模塊中的廣告功能基本定義完成。

如何集成到主程序

上面大致說了下cms模塊中的廣告功能相關源碼。在我們的項目中模塊與主程序盡量獨立。CMS是我們定義的一個內容管理模塊,廣告只是下面一個功能。源碼中的ZLJ.XXX是我們的主程序。這個主程序會來集成不同的模塊,廣告模塊就是其中之一。你也可以在你的abp項目中來單獨引入這個廣告模塊,只是目前這個模塊沒有發布成nuget包。

下面說說如何在我們主程序中使用cms模塊中的廣告功能

在ZLJ.EntityFrameworkCore/EntityFrameworkCore/ZLJDbContext中定義廣告相關實體的 DbSet

public virtual DbSet<AdEntity> BXJGCMSAds { get; set; }
public virtual DbSet<AdControlEntity> BXJGCMSAdControls { get; set; }
public virtual DbSet<AdPositionEntity> BXJGCMSAdPositions { get; set; }
public virtual DbSet<AdRecordEntity> BXJGCMSAdRecords { get; set; }

此時進入api頁面可以看到廣告服務接口https://git.weilaikj.cn/swagger/index.html,可以測試了。(打開頁面,Ctrl + F搜索"BXJGCMSFrontAdRecord")

在主程序中集成模塊時,手動在主程序的DbContext中定義DbSet比較繁瑣,網上有動態向DbContext加入DbSet的方法,著名的微信庫Senparc的SCF應該就是那種方式,不過我還不會。還有一個原因,有時候我們需要主程序在集成模塊注冊DbSet時提供實體泛型參數,手動方式最直觀。(動態DbSet應該也可以指定實體泛型參數)

由於廣告模塊足夠簡單,它不需要引用主程序的某些概念,也沒有考慮給模塊調用方提供擴展廣告、廣告位、廣告控件等的能力,因此在主程序集成廣告功能就很簡單。如果將來考慮允許模塊調用方通過繼承的方式,來為廣告添加更多自定義屬性,可以考慮在廣告相關的應用服務中,將廣告(AdEntity)變成泛型的。將來由模塊調用方來提供一個繼承至AdEntity的子類

另一種情況是模塊內部需要引用主程序的提供的一些概念時,比如 AdEntity中需要引用主程序中的XXX類,作為導航屬性,那么AdEntity本身就需要定義成泛型的AdEntity<xxx>,這樣模塊內部就不要直接依賴主程序的某個類,而是由將來主程序調用時指定

這里說的兩種情況后續會專門寫一篇來介紹,目前shop文件夾中相關源碼已有體現。

前端處理

通過IBXJGCMSFrontAdRecordAppService接口,前端頁面可以獲取當前發布的廣告信息,里面包含了廣告位、廣告控件、廣告、發布相關屬性,前端可以根據這些數據自由控制前端廣告的展示。這部分功能模塊沒有也很難提供。

結束

這里簡單介紹了下項目中設計的abp cms模塊中的廣告功能,這個設計參考了部分cms系統,目前只有個骨架,后續會逐步完善。目前項目中類似的模塊還有幾個,沒來得及寫說明。后續再補充吧。希望找到熱愛abp的朋友,一個做模塊,互相分享,因為我們可能在做一樣的功能,沒必要重復勞動。

目前的目標是開發常用,簡單、實用,不考慮擴展性的模塊,將來逐步實現擴展性  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM