1、项目5 建立网站新闻发布系统 5 目标: 5 任务1 发布新闻 5 5.1.1 任务描述 5 5.1.2 任务分析 6 5.1.3 相关知识 6 1、建立静态类 6 (1)对象分析 6 (2)属性分析 6 (3)定义新闻类 7 (4)建立新闻类 7 2、建立新闻数据表 8 3、建立添加新闻的存储过程 9 4、建立添加新闻的数据访问层 10 5、建立添加新闻操作的业务逻辑层 11 6、建立新闻分类的数据访问层 11 7、建立新闻分类的业务逻辑层 13 8、发布新闻操作的界面 13 (1)发布新闻的界面设计 13 (2)发布新闻的后台代码 16 5-1-4
2、任务实施 19 5-1-5 任务拓展 20 任务2 配置和应用FCKEditor编辑器 20 5.2.1 任务描述 20 5.2.2 任务分析 20 5.2.3 相关知识 20 1、配置FCKEditor编辑器 20 (1)FCKEditor简介 20 (2)下载FCKeditor 21 (3)引用FredCK.FCKeditorV2.dll文件 21 (4)把FCKeditor控件添加到Visual Studio 2008的工具箱中 21 (5)在WebConfig配置FCKeditor所需的参数 22 (6)FCKeditor详细的设置 22 (7)FCKedit
3、or的精简 23 2、应用FCKEditor编辑器 24 (1)把FCKEditor编辑器控件添加到网页中 24 (2)读取FCKeditor编辑器中的内容 25 5.2.4 任务实施 25 5.2.5 任务拓展 26 任务3 显示新闻内容 26 5.3.1 任务描述 26 5.3.2 任务分析 26 5.3.3 相关知识 26 1、新建读取新闻的存储过程 26 2、在数据访问层添加读取新闻的方法 27 3、在业务逻辑层添加读取新闻的方法 29 4、新建显示新闻列表的网页 29 (1)建立新闻列表页 29 (2)新闻列表页面规划 29 (3)新闻列表页面代码 3
4、1 (4)新闻列表的后台代码 34 (5)测试新闻列表页的浏览效果 34 5、新建显示新闻内容的网页 35 (1)新建显示新闻内容的网页,并设计该页的布局 35 (2)设计显示新闻的样式 35 (3)设计最清晰的动态样式 36 (4)显示新闻网页的具体代码 36 (5)显示新闻内容的后台代码 37 (6)显示结果 38 6、分页显示新闻内容 39 (1)分页新闻显示的必要性 39 (2)修改FCKeditor的分页功能 39 (3)新建按设定字符串分页的函数 40 (4)修改显示新闻的后台代码 41 (5)最终显示的分页效果 41 7、应用搜索引擎的排名规则 4
5、1 (1)编写搜索引擎最关注的内容 41 (2)新建一个网站配置的简单对象 41 (3)新建网站配置数据表 42 (4)新建读取网站配置的存储过程 42 (5)新建读取网站配置的数据访问层对象 42 (5)新建读取网站配置的业务逻辑层对象 43 (6)去HTML标记函数 44 (7)截取固定长度的字符串函数 45 (8)网页标题、关键字和描述的构成 45 (9)提示搜索引擎搜索该页 45 5.3.4 任务实施 46 5.3.5 任务拓展 47 任务4 修改和删除新闻 47 5.4.1 任务描述 47 5.4.2 任务分析 47 5.4.3 相关知识 47 5.
6、4.4 任务实施 47 5.4.5 任务拓展 47 任务5 静态显示新闻 47 5.5.1 任务描述 48 5.5.2 任务分析 48 5.5.3 相关知识 48 1、把指定动态网页的内容全部读取到内存 48 (1)取得动态网页的绝对网址 48 (2)下载指定动态网页的内容 48 2、打开一个文本文件 49 3、把内存中的数据写入到打开的文件 49 4、什么时候把动态发布的新闻静态化 50 5、修改添加新闻的网页,在添加新闻时生成静态网页 50 5.5.4 任务实施 51 5.5.5 任务拓展 51 任务6 应用jQuery添加动态样式 51 5.6.1 任务描
7、述 51 5.6.2 任务分析 51 5.6.3 相关知识 51 1、jQuery简介、下载与引用 51 2、jQuery选择器 52 (1)最简单的jQuery应用 52 (2)定义选中新闻内容的jQuery选择器 53 (3)设计选定对象应用的样式 53 3、jQuery的事件处理 53 (1)为特定元素应用事件 53 (2)jQuery中的ready事件 54 (3)鼠标悬停事件 54 4、jQuery的事件处理添加到哪里最合适 54 5、应用jQuery后的效果 55 5.6.4 任务实施 55 5.6.5 任务拓展 56 任务7 利用Ajax更新静态网
8、页的点击次数身 56 5.7.1 任务描述 56 5.7.2 任务分析 56 5.7.3 相关知识 56 1、Ajax简介 56 2、新建更新浏览次数的动态网页 57 3、XMLHttpRequest对象 57 (1)XMLHttpRequest对象简介 57 (2)创建XMLHttpRequest对象 58 4、建立要连接的URL 58 5、打开到服务器的连接 59 6、定义回调函数 59 7、发出请求 61 8、测试运行效果 61 5.7.4 任务实施 62 5.7.5 任务拓展 62 任务8 在新闻页插入广告 62 5.8.1 任务描述 62 5.8.
9、2 任务分析 62 5.8.3 相关知识 62 1、建立随机读取一个产品的存储过程 62 2、建立读取随机产品信息的数据访问层 63 3、建立读取随机产品信息的业务逻辑层 63 4、新建一个生成产品广告的方法 64 5、修改显示新闻的后台代码 64 6、测试广告效果 64 5.8.4 任务实施 65 5.8.5 任务拓展 65 任务9 给新闻页添加热点聚焦 65 5.9.1 任务描述 65 5.9.2 任务分析 65 5.9.3 相关知识 66 1、编写自定义控件 66 2、动态更新热点聚焦数据 72 (1)定义热点聚焦的XML数据源文件 72 (2)新建管理
10、热点聚焦数据源的网页 73 3、把热点聚焦控件添加到显示新闻的网页 77 4、建立用户控件 77 5、将热点聚焦用户控件添加到显示新闻的网页中 78 6、热点聚焦控件的显示效果 79 5.9.4 任务实施 79 5.9.5 任务拓展 79 小结 79 项目5 建立网站新闻发布系统 信息发布是网络营销的发动机。《左传·襄公二十五年》“仲尼曰:‘言以足志,文以足言。不言,谁知其志?言之无文,行而不远。’”既强调了宣传的重要也强调了内容的重要。在“酒香也怕巷子深”的时代,不言,谁知你是谁?不言,谁知你有什么产品?必须宣传企业、产品与服务,宣传才能提高暴光率,宣传才能保持你与
11、顾客的接触率。买东西,有人只买贵的,不买对的;有人只买对的,不买贵的;其实都只能买他知道的产品,根本不可能买不知道的产品。目前,在产能过盛,同质化严重的市场上,不论你的产品力多强,你不去宣传,都没戏。只有想办法把产品的利益传播到顾客的心里,让利益占领顾客的心智,营销才能成功。怎么才能让利益占领顾客的心智呢?就是信息发布。因此,信息发布是网络营销的发动机。 发布独特信息才能有好的搜索引擎排名。有网站而没有好的搜索引擎排名,就不能有效开展电子商务。甚至可以说没有好的排名就无商可务。现在的网站多如牛毛,对于非知名网站,用户主要依靠搜索引擎和其他网站上的链接来访问你的网站,而非依靠域名。不发布独特信
12、息,就不会有好的搜索引擎排名,没有好的搜索引擎排名你的网站做得再华丽,也不会有人找到,用户找不到你的网站就不可能形成销售。很多网站已经意识到这一点了,发布了大量的信息,但信息不是自己写的,基本全是转发的,没有自己的特点,没有独特性。目前的搜索引擎都有一定的智能,能够区分信息是不是转发的,转发的信息,对于搜索引擎排名有一定的帮助,但帮助不大。因此,发布独特的信息很重要。 丰富的信息能带来不同类型的客户。发布信息不仅要发布与企业有关的信息、与产品有关的信息、与销售有关的信息,更重要的是要发布与用户有关的信息,用户搜索他感兴趣的信息时,搜索到你的网站/网页,他看自己感兴趣的信息时,同时也看到了你的
13、网站与商品,如果他感觉你的网站不错,产品也好,当然就会购买。因此,不仅发布信息很重要,而且不能把网站的信息发布限定的范围太窄,你的客户感兴趣的信息都可以大量发布。 要大量发布信息,没有一个好的信息发布系统,一是费时费力,二是各个网页风格迥异,带给用户的感受很不好,他就会产生这样的感觉,你们网页就是这种水平,你们的产品也好不到哪去,用户看到你的产品他也不会购买你的产品。这也是造成那些相信只要有钱做广告就能做好营销的企业,经常出现广告点击量高而销售额低的尴尬现象的重要原因。 古语讲:“行之善者,在所能为。” 建立网站新闻发布系统有着重要意义,在本项目中研究如何才能做好信息发布系统。 目标:
14、 (1)建立一个让用户可以方便地发布新闻的系统(包括发布/修改/删除); (2)建立可以让浏览者可以愉快阅读的新闻显示页面; (3)通过前两项内容学习、实践,让读者掌握相关ASP.NET知识,学会基于三层架构ASP.NET网站开发; 任务1 发布新闻 5.1.1 任务描述 新闻发布系统是企业营销网站的一个重要子系统,新闻发布是一个网站最基本、也是最重要的工作。在这一任务中实现新闻发布系统中的新闻发布功能。 5.1.2 任务分析 如项目2中图XXX所示,新闻发布系统是基于三层架构进行开发的,基于三层架构建立进行项目开发的基本过程如下: à确定对象à建立实体类à建立数据表à建立数据
15、访问类à建立业务逻辑类à建立用户界面à建立后台代码à最后测试运行效果。 在这一任务中,按基于三层架构进行项目开发的基本过程,逐一完成新闻发布系统各个模块的开发,最终实现写成新闻发布功能。 5.1.3 相关知识 一个系统在编码前,都要经过分析与设计两个步骤。在分析阶段,一般抛开具体技术,首先抽象出类及其属性。 1、建立静态类 (1)对象分析 在企业营销网站项目中新闻发布是一个很简单的用例,从新闻发布用例中首先识别对象,然后提取出类。新闻发布的实体类是新闻类,因为新闻很多,进行分类管理会更加方便,如把新闻分为企业新闻、服务条款、专业知识、常见问题等,所以还需要一个新闻分类对象。 (2
16、属性分析 属性是用来描述类和对象的特性的。一个属性是一个数据项(状态信息),类中对象都有相应的值(状态)。在面向对象分析中,“属性”用来反映问题域和系统的任务;属性能帮助我们更深入、更具体的认识类和对象和结构,换句话说,属性能为“类和对象”以及“结构”提供更多的细节。 选择属性的过程包括分析和选择两步。一般步骤是:首先,在需求陈述中找出属性或通过分析找出属性。这些属性必须是问题域中对象的基本性质,而且在目标系统中是必要的。也就是说,只考虑与目标系统相关的属性,不考虑超出目标系统范围的属性。最后,恰当的给属性命名。 按照如上原则,企业营销网站系统中新闻分类的属性有编号、分类名称。新闻类的
17、属性有编号、新闻分类、标题、来源、作者、发布时间、内容、浏览次数等。 描述属性的语法格式为: 可见性 属性名 类型名 = 初值 {性质串} 在类图中公有类型用“+”表示,私有类型用“−”表示,把它们标识在属性名称的左侧。在分析阶段,不需要按照某种编程语言设计,也不需要设计具体细节。绘制分析阶段的实体对象图主要是用来与客户交流的,并为下一步的设计打下基础。新闻分类实体对象与新闻实体对象如图5-1-1所示。 图5-1-1 新闻分类与新闻的类图 (3)定义新闻类 根据分析材料与技术平台,把自定义的实体类转化成系统类。本实例网站是基于C#的ASP.NET网站,如图5-1-2所示,因为C
18、是一种很新的语言,一些UML分析工具中可能没有C#的数据类型,在实际设计时有一定的不便。 图5-1-2新闻分类与新闻的类图 (4)建立新闻类 根据系统类建立一个真实的类。右键单击Model项目类库,选择“新建项”,如图5-1-3所示,选择类模板,输入文件名NewsClass.cs,如图5-1-4所示。 图5-1-3 添加新项 图5-1-4 新建NewsClass.cs类文件 在新建的NewsClass.cs文件中,输入NewsClass类代码。Model项目类库中的类是实体类,只有字段与属性,没有方法。因
19、此,只需要为NewsClass类定义字段和属性。在.NET Framework 3.5中新增了自动属性,不需要定义字段变量,只需要简单地定义属性。NewsClass类的定义代码如下: namespace Model { public class NewsClass { public int ClassID { get; set; } public string ClassName { get; set; } } } 按照同样的方法,在Model项目类库中建立News.cs类文件,在新建的News.cs类文件中,输入News类代码,News类定义代码
20、如下。 using System; namespace Model { public class News { public int ID { get; set; } public NewsClass NewsClass { get; set; } public string Title { get; set; } public string Source { get; set; } public string Author { get; set; } public string Content { get; s
21、et; } public DateTime Updatatime { get; set; } public int Click { get; set; } } } 2、建立新闻数据表 静态模型中的数据的形态,是一种“瞬时”的数据,即在程序运行的时候存在于内存中,一旦程序结束,或者数据处理结束,数据就从内存中被清除。数据的另外一种表现形态,就是永久化保存的形态。在很多情况下,需要把处理的数据保存到磁盘上,使数据成为永久化保存数据。新闻类也是一样的,需要将新闻信息的数据保存起来才能在今后浏览。 数据库是最常用,也是最有效的数据存储方法。在一般的项目中都采用数据库来
22、保存数据,我们这个实例项目采用SQL Server来保存数据。 使用面向对象技术把数据保存在对象中,SQL Server是关系型数据库,怎么把保存在对象中的数据保存到关系型数据库,使“瞬时”数据变成永久数据呢?采用面向对象建模技术建立了对象模型后,可以把静态对象映射到数据库,映射方法是把静态模型中的类和关系数据库中的表相对应,数据表的名称对应类的名称,类数据表的列分别对应类属性。静态模型中类的一个实例(对象)和数据模型中表的一条纪录(行)相对应。但需要注意:从静态类到表的映射不全是一一对应的,对于简单的应用,大多数静态模型中的类与数据库中的表是一一对应的。 按项目3中讲述的方法,打开网站的
23、数据库,在这个数据库中再添加NewsClass表,根据NewsClass类在SQL Server建立的NewsClass表,NewsClass表定义如图5-1-5所示。在这个数据库中再添加News表,根据News类在SQL Server建立的News表,News表结构如图5-1-6所示。 注意:要把新建的NewsClass表的ClassID字段定义为关键字段,并把该字段是否是标识规范设为“是”,参见图5-1-5。同理,要把新建的News表中的ID字段定义为关键字段,并把该字段是否是标识规范设为“是”。 图5-1-5 NewsClass表结构
24、 图5-1-6 News表结构 把静态对象映射到数据库后,就可以利用ADO.NET技术,把静态对象中的数据保存到数据库中了。 3、建立添加新闻的存储过程 打开本实例网站的数据库(EMData.MDF),按项目3中所述的添加存储过程的方法,建立添加新闻的存储过程(Add_News)。代码如下: ALTER PROCEDURE [dbo].[Add_News] ( @ClassID int, @Title nvarchar (50), @Source nvarchar(50), @Author nvarchar(50), @Content ntext, @Updatat
25、ime Datetime, @Click int ) AS INSERT INTO News(ClassID, Title, Source, Author, Content, Updatatime, Click) Values(@ClassID, @Title, @Source, @Author, @Content, @Updatatime, @Click) RETURN @@Identity 在此存储过程中的最后一句是RETURN @@Identity,这一句很重要,对于添加记录的存储过程,如果数据表中的关键字段是标识字段,它就返回了新添加的一条新闻的自动编号。通过程序可以访问
26、 获得该返回值的方法是:首先,定义命令对象获取默认返回值的参数,默认返回参数的参数名称是ReturnValue,参数的类型是SqlDbType.Int、参数的宽度为4、参数的方向是返回值ReturnValue、参数的精度、参数的小数位数、源列、要使用的DataRowVersion和参数的值初始化SqlParameter类的新实例。这个参数的属性很多,方法代码有些复杂,但很实用。示例代码如下: cmd.Parameters.Add(new SqlParameter("RETURNVALUE", SqlDbType.Int, 4, ParameterDirection.ReturnVal
27、ue, false, 0, 0, string.Empty, DataRowVersion.Default, null)); 然后,在执行存储过程之后,用如下的方法获取返回值: int ID = (int)cmd.Parameters["RETURNVALUE"].Value; 4、建立添加新闻的数据访问层 打开DAL项目类库,在其中新建一个NewsDAL.cs类文件(参见图5-1-3),这是添加新闻的数据访问层,用该类直接操作数据库中的News表,在其中新建Add_News()方法,用该方法向News表添加新闻。代码如下: using System; using System
28、Collections.Generic; using System.Data; using System.Data.SqlClient; using Model; using SQLHelper; namespace DAL { public class NewsDAL { public int Add_News(News news) { SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper(); SqlParameter[] ParamList =
29、 { sqlHelper.CreateInParam("@ClassID",SqlDbType.Int,4,news.NewsClass.ClassID), sqlHelper.CreateInParam("@Title",SqlDbType.NVarChar,50,news.Title), sqlHelper.CreateInParam("@Source",SqlDbType.NVarChar,50,news.Source), sqlHelper.CreateInParam("@Author",SqlDbType.NVarChar,50,news.Author), sqlHe
30、lper.CreateInParam("@Content",SqlDbType.NText,0,news.Content), sqlHelper.CreateInParam("@Updatatime",SqlDbType.DateTime,8,news.Updatatime), sqlHelper.CreateInParam("@Click",SqlDbType.Int,4,news.Click) }; try { return (sqlHelper.RunProc("Add_News", ParamList));
31、 } catch (Exception ex) { SystemError.CreateErrorLog(ex.Message); throw new Exception(ex.Message, ex); } finally { sqlHelper.Close(); } } } 5、建立添加新闻操作的业务逻辑层 打开BLL项目类库,在其中新建一个NewsService.cs类文件,并在该文件中添加一个Add_News()方法,用它把从网页中接
32、收到的数据传递给NewsDAL对象的Add_News()方法,实现添加新闻。代码如下: using System.Collections.Generic; using DAL; using Model; namespace BLL { public class NewsService { public int Add_News(News news) { NewsDAL newsDAL = new NewsDAL(); return (newsDAL.Add_News(news)); } } } 6、建
33、立新闻分类的数据访问层 打开DAL项目类库,在其中新建一个NewsClassDAL.cs类文件,用该类直接操作数据库中的NewsClass表,在NewsClassDAL.cs类文件新建Get_NewsClass ()方法,读取所有新闻分类,再建立一个Get_SingNewsClass ()方法,按ID读取指定的新闻分类。代码如下: using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using Model; using SQLHelper;
34、
namespace DAL
{
public class NewsClassDAL
{
public List
35、 SqlDataReader rec = null;
try
{
sqlHelper.RunProc("Get_NewsClass", ParamList, out rec);
}
catch (Exception ex)
{
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
}
List
36、ass = new List
37、 null; } sqlHelper.Close(); return List_NewsClass; } public NewsClass Get_SingNewsClass(int nClassid) { SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper(); SqlParameter[] ParamList = { sqlHelper.CreateInParam("@Classid",SqlD
38、bType.Int,4,nClassid) }; SqlDataReader rec = null; try { sqlHelper.RunProc("Get_SingNewsClass", ParamList, out rec); } catch (Exception ex) { SystemError.CreateErrorLog(ex.Message); throw new Exception(ex.Message, ex);
39、 } NewsClass newsClass = new NewsClass(); while (rec.Read()) { newsClass.ClassID = Int32.Parse(rec["ClassID"].ToString()); newsClass.ClassName = rec["ClassName"].ToString(); } sqlHelper.Close(); return newsClass; } } } 7、建立新闻分类
40、的业务逻辑层
打开BLL项目类库,在其中新建一个NewsClassService.cs类文件,用它把从网页中接收到的数据传递给NewsClassDAL对象的相关方法,读取新闻分类的内容。在该类中新建一个Get_NewsClass()方法和一个Get_SingNewsClass()方法。代码如下:
using System.Collections.Generic;
using DAL;
using Model;
namespace BLL
{
public class NewsClassService
{
public List
41、NewsClass() { NewsClassDAL newsClassDAL = new NewsClassDAL(); return (newsClassDAL.Get_NewsClass(nParentID)); } public NewsClass Get_SintNewsClass(int nClassid) { NewsClassDAL newsClassDAL = new NewsClassDAL(); return (newsClassDAL.Get_SintNewsClass(
42、nClassid));
}
}
}
8、发布新闻操作的界面
(1)发布新闻的界面设计
发布新闻的界面设计如图5-1-7所示。
图5-1-7 添加新闻的界面
右键单击网站项目中的Admin文件夹,选择“添加新项”,新建一个Add_News.aspx网页文件。参考图5-1-7,在Add_News.aspx网页中用表格布局,建立最简单的添加新闻操作界面,一般的信息输入都采用文本框,如输入标题文本的文本框为
43、新闻分类下拉列表控件的代码为
44、/asp:TextBox>。 添加新闻操作界面的完整代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Add_News.aspx.cs" Inherits="admin_Add_News" %> <%@ Register Src="Bottom.ascx" TagName="Bottom" TagPrefix="uc1" %>