广告模块设计
广告能够为网页带来很多的增色功能效果和盈利,广告模块的设计对网站来说非常重要,一个网站不可能只有一个广告或者网站的广告还需要手动增加和删除。广告模块需要随机的获取系统广告或者能够在相应的位置增加广告来实现更多广告效果。
数据库设计
对于广告模块的数据库设计可能比较的复杂,其复杂并不在数据库设计的本身上,数据库本质上就是一种存储数据的容器,而如何进行数据筛选在广告模块中是一个最为重要的过程,对于数据库的设计就需要考虑到广告模块中的数据筛选。
数据库表的创建
创建表可以通过SQL Server Management Studio视图进行创建也可以通过SQL Server Management Studio 查询使用SQL语句进行创建。广告模块需要创建多个表进行广告的描述,在创建表之前首先需要创建一个ad数据库,数据库创建完成后就能够在数据库中创建表了。这里首先需要创建一个ads表,该表用于存储广告模块中的广告信息,如图下所示;
clip_p_w_picpath002
图ads表结构
正如图上所示,其中的字段意义如下所示。
id:表示广告的ID号,为自动增长的主键。
time:用于标识广告的开始时间
endtime:用于标识广告的结束时间,当时间到达该时间后,广告将不再被呈现。
name:用于标识广告的名称,这个名称在后台管理中可以进行辨认。
content:作为广告的内容而存在,管理员能够在该字段进行广告内容的编写。
infor:作为广告的备注而存在,管理员和管理员之间能够通过备注阅读该广告是什么广告。
picture:作为图片广告的图片连接。
url:作为外部连接的广告的地址,用户单击广告时能够跳转到相应的连接。
title:作为广告的标题,呈现在页面之中。
html:作为广告呈现的HTML代码,可以为JavaScript代码,当广告为文字广告时,将呈现HTML。
type:作为广告的类型而存在,类型没描述在type表中。
adid:作为广告的广告ID而存在,用于归纳同类广告,一个页面可以呈现一种或多种类型的广告。
上述字段描述了相应的字段在实际应用中的意义,创建表的SQL语句如下所示:
USE [ad]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ads]( //创建ads表
[id] [int] IDENTITY(1,1) NOT NULL,
[time] [datetime] NULL,
[endtime] [datetime] NULL,
[name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[content] [nvarchar](max) COLLATE Chinese_PRC_CI_AS NULL,
[infor] [nvarchar](max) COLLATE Chinese_PRC_CI_AS NULL,
[picture] [nvarchar](500) COLLATE Chinese_PRC_CI_AS NULL,
[url] [nvarchar](500) COLLATE Chinese_PRC_CI_AS NULL,
[title] [nvarchar](500) COLLATE Chinese_PRC_CI_AS NULL,
[html] [nvarchar](max) COLLATE Chinese_PRC_CI_AS NULL,
[type] [int] NULL,
[adid] [int] NULL,
CONSTRAINT [PK_ads] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
上述代码创建了一个ads表用于存储广告数据,其中的type字段和adid字段都是其他表的外键,这三个表一起完成整个广告模块的数据描述,type表创建的SQL语句如下所示。
USE [ad]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[type]( //创建type表
[id] [int] IDENTITY(1,1) NOT NULL,
[classname] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_type] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
type表用于描述广告的类型,而adclass表用于描述广告呈现的类型,这两个表是有区别的。type主要描述的是广告的类型,包括图片广告、文字广告等,是系统类型,通常情况下是不会更改的。而adclass用于描述的是广告呈现时所需要的类型,例如头部广告和底部广告,这些广告通过adclass表进行筛选和整合。adclass表创建的SQL语句如下所示。
USE [ad]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[adclass]( //创建adclass表
[id] [int] IDENTITY(1,1) NOT NULL,
[classname] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_adclass] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
上述代码创建了一个adclass表,使用该表能够将广告进行分类并呈现到相应的页面中,可以极大程度的避免同种类型的广告的呈现。数据库的设计是非常重要的,也是在软件开发过程中一个非常重要的环节。在广告模块中,必须先规定好,以及规划好广告模块的数据库设计,否则数据库的更改会带来很多的不便,例如如果将adclass表和type表整合在ads表中,如果要修改一个字段的值,例如修改图片类型的广告,有可能需要更改一个或多个数据,这样就非常的不方便,也会导致数据的混乱,所以数据库设计在任何模块甚至是系统的开发过程中都是非常重要的一个环节。
界面设计
发布广告页数据源配置
在发布广告页面中使用了数据源控件进行数据源的呈现。在页面中,需要对数据源进行配置、筛选和生成才能够在发布页面中进行数据选择。单击【配置数据源】按钮,选择【新建连接】选项,在新建连接窗口中进行数据源配置,如图24-5所示。
拖放一个数据源控件到页面,用于配置adclass数据连接和数据绑定,创建数据连接后,选择【将数据连接保存到Web.config】选项,在项目里就可以使用该连接进行数据连接和绑定,如图下所示;
clip_p_w_picpath004
clip_p_w_picpath006
创建连接后,就可以自动生成SELECT语句填充数据绑定控件,方便开发,在完成SELECT语句的配置,就可以在相应的控件中使用数据源呈现的数据,例如在广告类型的下拉菜单中就可以使用数据源控件进行数据显示,如图下所示;
clip_p_w_picpath008
clip_p_w_picpath010
在选择了数据源之后,就可以为另一个下拉菜单进行数据源配置,配置过程与上面的代码相同。配置完成后,页面增加了数据源控件的代码和数据绑定控件代码。
管理广告界面
管理广告界面可以使用现有的ASP.NET数据源控件和ASP.NET数据绑定控件实现,ASP.NET数据源控件和数据绑定控件能够快速的提供数据的更新、删除等功能。由于这里使用的是自定义更新页面,就不能够使用数据源控件本身提供的数据更新功能,对于管理广告界面,只需要进行数据删除操作的支持即可。
上述代码配置了数据源控件的高级模式以支持数据绑定控件中的更新、删除等操作,这里只需要使用删除操作就能够实现广告的管理,更新操作无需使用自带的更新而使用自定义页面。单击【数据绑定】控件,在菜单中单击【功能模块】按钮,选择【添加新列】选项,在【选择字段类型】选项中选择【HyperLinkFiled】选项并填写HyperLinkFiled类型字段中提供的相应的数据列和数据显示策略,如图所示。
在数据绑定控件中能够使用【更新】连接进行页面跳转功能的实现,如图所示,其中就包括了系统自带的删除操作和开发人员自定义的更新操作。
clip_p_w_picpath012
clip_p_w_picpath014
其中数据绑定控件选择了自动套用格式让管理界面看上去更加的友好,管理人员能够在该界面查看相应的广告信息并且删除相应的信息,如果管理人员要修改相应的数据,可以单击【修改】按钮在自定义页面中进行广告的修改。
分类管理界面
分类管理界面比较的简单,因为分类管理表中的字段非常的少,所以分类管理界面就能够使用现有的控件,如Grid View控件进行数据插入、删除和更新,在分类管理界面中,可以直接使用控件进行操作,这样就能够在多个页面进行复杂的管理。
上述代码使用了ListView控件并自动套用格式,使管理员在操作的时候更加方便和简单,ListView控件能够直接进行数据的插入、更新和删除,更加简便的进行了数据管理,如图所示。
clip_p_w_picpath016
分类管理页面是广告模块中一个比较容易实现的模块,但在功能上却是非常重要的模块,因为在广告的分类管理是非常重要的,在自定义控件的开发过程中,可以通过广告的分类管理进行广告的筛选,以及整合,通过广告的分类可以在网站的不同页面进行不同的广告的呈现,以及不同广告的筛选,避免了广告的重复。
代码实现
虽然控件为开发提供了良好的支持,但是控件毕竟样式死板、界面布局有限,而且代码实现也有限,所以很多情况下都需要使用自定义页面进行应用程序的开发,使用控件虽然能够方便和快速的进行功能开发,但是却无法避免死板的界面布局和有限的功能。
广告添加功能
广告添加功能可以使用ADO.NET进行广告添加,ADO.NET可以执行INSERT语句进行数据库中的数据插入,在广告添加页面,管理员在填写完相应的项目时,可以单击按钮控件进行数据插入。在postad.aspx页面中,制作完成页面并双击【控件】按钮,Visual Studio 2008能够自动生成相应的事件,开发人员可以在该事件中使用ADO.NET进行数据操作代码的编写,示例代码如下所示。
protected void Button1_Click(object sender, EventArgs e)
{
try
{
SqlConnection con = new SqlConnection("Data Source=(local);Initial Catalog=ad;Integrated
Security=True"); //创建连接
con.Open(); //打开连接
string strsql = "insert into ads (time,endtime,name,content,infor,picture,url,title,html,type,adid)
values ('" + Convert.ToDateTime(Calendar1.SelectedDate).ToString() + "','"
+ Convert.ToDateTime(Calendar2.SelectedDate).ToString() + "','" +
TextBox1.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" +
TextBox6.Text + "','" + TextBox7.Text + "','" + TextBox2.Text + "','" +
TextBox5.Text + "','" + DropDownList1.Text + "','" + DropDownList2.Text + "')";
SqlCommand cmd = new SqlCommand(strsql, con); //创建执行
cmd.ExecuteNonQuery(); //执行SQL
Response.Redirect("manage.aspx"); //页面跳转
}
catch(Exception ee)
{
Response.Write(ee.ToString()); //抛出异常
}
}
广告添加过程非常的容易,正如上述代码所示,直接对数据库中的数据进行插入操作就能够插入一条新广告,对于自定义控件,可以从数据库中获取广告和筛选广告进行呈现。
广告修改功能
广告修改页面是广告模块中的自定义页面,这个页面使用的是控件进行组合开发,当页面被加载时,首先需要通过传递的参数进行查询,查询后填充到控件中,示例代码如下所示。
protected void Page_Load(object sender, EventArgs e)
{
try
{
if (!IsPostBack) //判断加载
{
if (Request.QueryString["id"] == "") //获取参数
{
Response.Redirect("manage.aspx"); //页面跳转
}
SqlConnection con =
new SqlConnection("Data Source=(local);Initial Catalog=ad;Integrated Security=True");
con.Open(); //打开连接
string strsql = "select * from ads where id='" + Request.QueryString["id"].ToString() + "'";
SqlDataAdapter da = new SqlDataAdapter(strsql, con); //创建适配器
DataSet ds = new DataSet(); //创建数据集
int count = da.Fill(ds, "table"); //填充数据集
if (count > 0) //判断数据
{
TextBox1.Text = ds.Tables["table"].Rows[0]["name"].ToString(); //初始化控件
TextBox2.Text = ds.Tables["table"].Rows[0]["title"].ToString(); //初始化控件
TextBox3.Text = ds.Tables["table"].Rows[0]["content"].ToString(); //初始化控件
TextBox4.Text = ds.Tables["table"].Rows[0]["infor"].ToString(); //初始化控件
TextBox5.Text = ds.Tables["table"].Rows[0]["html"].ToString(); //初始化控件
TextBox6.Text = ds.Tables["table"].Rows[0]["picture"].ToString(); //初始化控件
TextBox7.Text = ds.Tables["table"].Rows[0]["url"].ToString(); //初始化控件
Calendar1.SelectedDate = ds.Tables["table"].Rows[0]["time"].ToString(); //初始化控件
Calendar2.SelectedDate = ds.Tables["table"].Rows[0]["endtime"].ToString();
DropDownList1.Text = ds.Tables["table"].Rows[0]["type"].ToString();//初始化控件
DropDownList2.Text = ds.Tables["table"].Rows[0]["adid"].ToString();//初始化控件
Label1.Text = ds.Tables["table"].Rows[0]["id"].ToString(); //初始化控件
}
else
{
Response.Redirect("manage.aspx"); //页面跳转
}
}
}
catch
{
Response.Redirect("manage.aspx"); //错误页跳转
}
}
当页面被加载时就会执行上述代码,上述代码仅仅是在数据库中查询相应的数据,并呈现在相应的控件中,这样管理员在加载页面时就能够修改现有的数据内容进行更新。当管理员更新完毕后,单击相应的事件按钮就能够执行数据更新操作,数据更新操作示例代码如下所示。
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("Data Source=(local);
Initial Catalog=ad;Integrated Security=True"); //创建连接字串
con.Open(); //打开连接
string strsql = "update ads set time='" + Calendar1.SelectedDate + "',endtime='" +
Calendar2.SelectedDate + "',name='" + TextBox1.Text + "',title='" + TextBox2.Text +
"',content='" + TextBox3.Text + "',infor='" + TextBox4.Text + "',html='" + TextBox5.Text +
"',picture='" + TextBox6.Text + "',url='" + TextBox7.Text + "',type='" + DropDownList1.Text +
"',adid='" + DropDownList2.Text + "' where id='" + Label1.Text + "'"; //更新SQL
SqlCommand cmd = new SqlCommand(strsql, con); //创建执行
cmd.ExecuteNonQuery(); //执行SQL语句
Response.Redirect("manage.aspx"); //页面跳转
}
上述代码通过ADO.NET进行数据更新,从上面代码可以看出使用ADO.NET进行数据更新非常的简单,只需要打开数据库连接,在连接过程中使用SqlCommand对象执行ExecuteNonQuery方法进行数据的插入和删除操作就能够对数据库进行操作。
自定义控件的实现
在增加广告、删除广告和广告管理等页面制作完毕后,这也就意味着后台基本制作完毕,管理员可以在后台进行广告的增加和删除以及管理,也可以对广告的类别进行管理。后台制作完毕后就需要在前台呈现广告,前台广告的呈现可以通过制作自定义控件进行呈现。
右击现有解决方案管理,在下拉菜单中选择【添加新项】选项,在【添加新项目】窗口中选择【自定义控件】项,这里创建一个名为Ad的自定义控件,如图所示。
clip_p_w_picpath018
自定义控件用于筛选广告和呈现广告,筛选过程可以使用自定义控件的属性和方法完成,在编写完成自定义控件之后,就能够通过向页面拖动自定义控件和属性配置进行广告呈现,自定义控件属性编写示例代码如下所示。
[Bindable(true)] //设置允许绑定
[DefaultValue("")] //默认值为空
[Localizable(true)] //允许本地化
public string type //设置广告类型
{ get; set; }
[Bindable(true)] //设置允许绑定
[DefaultValue("")] //默认值为空
[Localizable(true)] //允许本地化
public string adid
{ get; set; }
[Bindable(true)]
[DefaultValue("Data Source=(local);Initial Catalog=ad;Integrated Security=True")] //设置连接字串
[Localizable(true)]
public string SQLConnectionString
{ get; set; }
[Bindable(true)] //设置允许绑定
[DefaultValue("")] //默认值为空
[Localizable(true)] //允许本地化
public bool text //设置是否为文字
{ get; set; }
[Bindable(true)] //设置允许绑定
[DefaultValue("")] //默认值为空
[Localizable(true)] //允许本地化
public string CssStyle //设置CSS样式
{ get; set; }
[Bindable(true)] //设置允许绑定
[DefaultValue("")] //默认值为空
[Localizable(true)] //允许本地化
public string TitleCssStyle //设置标题CSS
{ get; set; }
[Bindable(true)] //设置允许绑定
[DefaultValue("")] //默认值为空
[Localizable(true)] //允许本地化
public string ContentCssStyle //设置内容CSS
{ get; set; }
[Bindable(true)] //设置允许绑定
[DefaultValue("")] //默认值为空
[Localizable(true)] //允许本地化
public int ShowNumber //设置显示个数
{ get; set; }
上述代码为自定义控件设置了属性,管理员可以使用此控件并设置属性进行控件的编写和调用相应的广告代码,自定义控件HTML页面实现代码如下所示。
protected override void RenderContents(HtmlTextWriter output)
{
try
{
string constring = "Data Source=(local);Initial Catalog=ad;Integrated Security=True";
if (SQLConnectionString != null) //获取连接字串
{
constring = SQLConnectionString;
}
SqlConnection con = new SqlConnection(constring); //创建连接对象
con.Open(); //打开连接
string strsql = "select * from ads order by id desc"; //默认SQL语句
if (type != null&&adid!=null) //筛选SQL语句
{
strsql = "select * from ads where type='" + type + "' and adid='" + adid + "' order by id desc";
}
else if (type != null) //筛选SQL语句
{
strsql = "select * from ads where type='" + type + "' order by id desc";
}
else if (adid != null) //筛选SQL语句
{
strsql = "select * from ads where adid='" + adid + "' order by id desc";
}
SqlDataAdapter da = new SqlDataAdapter(strsql,con); //创建适配器
DataSet ds = new DataSet(); //创建数据集
int count=da.Fill(ds, "table"); //填充数据集
if (count > 0) //判断项数
{
if (ShowNumber < count) //判断生成条目
{
count = ShowNumber; //获取用户设置
}
StringBuilder build = new StringBuilder(); //创建String对象
//开发人员可以在这里使用属性中的样式
build.Append("&lt;div style=\"padding:10px 10px 10px 10px;border:1px dashed #ccc;\">");
for (int i = 0; i < count; i++) //遍历输出
{
build.Append("&lt;div style=\"font-size:14px;border-bottom:1px dashed #ccc;\">
<a href=\"" + ds.Tables["table"].Rows[i]["url"].ToString() + "\">" +
ds.Tables["table"].Rows[i]["title"].ToString() + "</a></div>");
build.Append("<div
style=\"font-size:12px;\">" + ds.Tables["table"].Rows[i]["content"].ToString() +
"</div>"); //输出HTML
}
build.Append("</div>"); //输出HTML
Text = build.ToString(); //呈现广告内容
}
else
{
Text = "暂时没有任何投放的广告"; //提示没广告
}
output.Write(Text); //输出HTML
}
catch(Exception ee)
{
Text = ee.ToString(); //抛出异常
output.Write(Text); //输出异常信息
}
}
上述代码通过配置不同的属性进行SQL语句生成,例如当用户配置了type属性和adid属性,SQL语句就能够生成筛选type和adid属性的SQL语句,当开发人员使用自定义控件时,只需要在页面中拖动相应的控件并配置相应的属性即可。
在需要使用广告控件的页面中,必须要引用控件,单击需要引用的项目,单击右键,单击添加引用,在项目选项卡中选择项目或在浏览选项卡中选择相应的DLL文件就能够添加引用,引用添加完毕后能够通过控件拖动生成广告代码。
当开发人员使用自定义控件并拖动到页面时,可以配置一些基本属性就能够呈现不同的广告类型。开发人员还能够进行多次开发和扩展进行自定义控件编程,通过获取和判断数据库中的字段进行不同类型广告的呈现。
开发人员可以选择修改和删除相应的信息以在页面呈现不同的广告内容,开发人员在相应的页面可以使用自定义控件进行广告呈现,示例代码如下所示。
<body>
<form id="form1" runat="server">
<div>
<cc1:ads ID="ads1" runat="server" ShowNumber=”10”/> //ShowNumber为必填项
</div>
</form>
</body>