无论是开发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的朋友,一个做模块,互相分享,因为我们可能在做一样的功能,没必要重复劳动。

目前的目标是开发常用,简单、实用,不考虑扩展性的模块,将来逐步实现扩展性  

abp-CMS模块-广告的更多相关文章

  1. ABP之模块

    ABP的反射 为什么先讲反射,因为ABP的模块管理基本就是对所有程序集进行遍历,再筛选出AbpModule的派生类,再按照以来关系顺序加载. ABP对反射的封装着重于程序集(Assembly)与类(T ...

  2. 极简实用的Asp.NetCore模块化框架新增CMS模块

    简介 关于这个框架的背景,在前面我已经交代过了.不清楚的可以查看这个链接 极简实用的Asp.NetCore模块化框架决定免费开源了 在最近一段时间内,对这个框架新增了以下功能: 1.新增了CMS模块, ...

  3. 精简ABP的模块依赖

    ABP的模块非常方便我们扩展自己的或使用ABP提供的模块功能,对于ABP自身提供的模块间的依赖关系想一探究竟,并且试着把不必要的模块拆掉,找到那部分核心模块.本次使用的是AspNetBoilerpla ...

  4. Abp 审计模块源码解读

    Abp 审计模块源码解读 Abp 框架为我们自带了审计日志功能,审计日志可以方便地查看每次请求接口所耗的时间,能够帮助我们快速定位到某些性能有问题的接口.除此之外,审计日志信息还包含有每次调用接口时客 ...

  5. ABP框架 - 模块系统

    文档目录 本节内容: 简介 模块定义 生命周期方法 PreInitialize(预初始化) Initialize(初始化) PostInitialize(提交初始化) Shutdown(关闭) 模块依 ...

  6. ABP之模块分析

    本篇作为我ABP介绍的第三篇文章,这次想讲下模块的,ABP文档已经有模块这方面的介绍,但是它只讲到如何使用模块,我想详细讲解下它模块的设计思路. ABP 框架提供了创建和组装模块的基础,一个模块能够依 ...

  7. 织梦CMS去广告方法 for DedeCMS V5.7

    DedeCms 5.7新版发布,下来上传至服务器安装完毕,点击进入后台登陆界面,怎么多了广告链,而且登陆界面也变了,以前可不带这样的啊.按步骤一步一步来去版权再去广告吧. 一,去处后台登陆页login ...

  8. ABP之模块系统

    简介 ASP.NET Boilerplate提供了构建模块的基础结构,并将它们组合在一起以创建应用程序. 模块可以依赖于另一个模块. 通常,一个程序集被视为一个模块. 如果创建具有多个程序集的应用程序 ...

  9. ABP中模块初始化过程(二)

    在上一篇介绍在StartUp类中的ConfigureService()中的AddAbp方法后我们再来重点说一说在Configure()方法中的UserAbp()方法,还是和前面的一样我们来通过代码来进 ...

随机推荐

  1. Django ORM性能优化之count和len方法的选择(非常详细推荐干货)

    接下来我将从源码层面分情况和应用分析我们在计算queryset数据集时是用orm的count函数计算长度还是用len函数计算数据集长度. 首先,我们知道ORM查询queryset数据集是惰性查询的,只 ...

  2. 王艳 201771010127《面向对象程序设计(java)》第二周学习总结

     王艳 201771010127<面向对象程序设计(java)>第二周学习总结 第一部分:理论知识学习部分 3.1:基本概念. 1)标识符:标识符由字母.数字.美元符号以及下划线组成.且第 ...

  3. UVA10779 Collectors Problem

    题目链接:https://cn.vjudge.net/problem/UVA-10779 前言: 本题是关于姜志豪<网络流的一些建模方法>的笔记. 知识点: 最大流 题意摘抄: \(Bob ...

  4. C# 数据操作系列 - 14 深入探索SqlSugar

    0.前言 在上一篇中,我们知道了如何使用SqlSugar,但是也只是简单的了解了如何使用,仿佛是套着镣铐行走,这明显不符合一个合格的程序员应有的素养.所以,这一篇我们将对其进行深挖,探究其背后的秘密. ...

  5. 在Cent OS云服务器上部署基于TP5后端代码踩坑记录_艾孜尔江撰

    推荐使用镜像安装Cent OS系统,或者在纯净安装完成之后在完成Apache+MySQL+PHP的时候不要每个单独安装,因为这样会出一些三者之间版本不配的问题,网上各种说法都有,查起来也非常困难,版本 ...

  6. web自动化之浏览器的窗口切换

    from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...

  7. mysql排序,同样的语句 查询结果不一样的问题

    一个项目,某段数据顺序出现异常导致运行异常.早期没有问题,用开发版本也没有问题,同样的查询排序语句在mysql客户端执行也没有问题. 这个排序不一致问题,这里记录下. 如下查询语句,根据‘order’ ...

  8. 应用4:利用Filter限制用户浏览权限

    1. 使用 Filter 完成一个简单的权限模型: 1). 需求: ①. 管理权限 > 查看某人的权限 > 修改某人的权限 ②. 对访问进行权限控制: 有权限则可以访问, 否则提示: 没有 ...

  9. win10系统下计算器界面变成英文的解决方法

    标题: win10系统下计算器界面变成英文的解决方法 作者: 梦幻之心星 347369787@QQ.com 标签: [win10, 计算器, 英文] 目录: 软件 日期: 2019-04-20 目录 ...

  10. 《学习scrapy框架爬小说》的进一步完善

    一.完善目标: 1.为方便使用,把小说拼音或英文名,小说输出中文名,第一章节url地址变量化,修改这些参数即可爬取不同的小说. 2.修改settings.py设置文件,配置为记录debug的log信息 ...