前一段时间学了一些架构方面的东西,后来突发灵感,为什么不自己设计一个小系统呢。于是我就选择了目前比较流行的blog来试一试,要知道我原来只做过一些简单网站的后台,经验是少之又少,但我还是很有信心的,因为时间多嘛。
构思了一段时间就开始动工了,因为我原来用的是sohu的blog,所以这次我选择仿照这个来做。这样系统需求方面就很容易定下来了,自己用用就知道有哪些主要的功能了。设计一个系统嘛当然要选择一个工具来做了,据我了解,这方面比较权威的工具rose比较不错,于是我到处serach,到处咨询网友,最后还是一个热心的网友给了我一个老版本的rose工具。装上工具,立马上路,简单熟悉了下工具,发现那个版本的只能用c++,java,vb语言,可我熟悉的c#只能丢在一边了,好在设计系统的思想都是一致的。
首先,我结合blog的常用功能画了usecase图,如下:
由于我是上班时抽出点时间来做的,可能还漏掉些东西,到后来才发现有好多东西不对,但我想设计就是这样反复修改反复确认。
接着,我确定了几个业务对象,画了个类图,如下:
这样要补充说下,当我在真正写核心代码时,其实很多东西和现在的类图不一致,比如说根本不需要Administrator,Viewer类,由于是单用户的blog根本不需要嘛,如果我有时间会继续做成多用户的blog的,现在不都讲求实用嘛,还有两个类Comment和CommentEntry其实可以合成一个类。至于类的实例变量和方法那改的就多了。
然后我根据usecase图画了时序图,后台管理场景时序图如下:
留言场景时序图如下:
评论场景时序图如下:
最后我根据时序图确定了业务类的方法,至此初步的设计工作到此为止,下面就开始写核心代码了。
由于第一次用rose工具,代码都不知道怎么生成,就自己慢慢写吧。一开始确定了七个主要业务对象类,Category.cs,CategoryColl.cs,Diary.cs,DiaryColl.cs,CommentEntry.cs,CommentEntryColl.cs,Program.cs.
Category.cs是日志分类类,包括分类的实例变量,属性常用方法。
Diary.cs是日志类,包括日志的实例变量,属性常用方法。
CommentEntry.cs是评论类,包括评论的实例变量,属性常用方法。
CategoryColl.cs,DiaryColl.cs,CommentEntryColl.cs是用来把数据库的数据序列化到实例对象的。
Program.cs是驱动类,用来在命令行下测试业务类的。
经过耐心的测试,中途断断续续,几经波折,测试成功。以下是其中一个命令行的图:
到目前为止已经完成了业务逻辑层和数据访问层的工作,最后一步开始UI层的工作了。建立了一个website,补充了一个UiOperator.cs类,专门用来显示后台数据的。前台显示页面有四个,分别为:Default.aspx,diaryByCommendId.aspx,diaryByDiaryId.aspx,diarysByCategory.aspx。
Default.aspx页面为首页,Default.aspx.cs代码如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//数据初始化
Program.Initialization();
//分类显示;
DataView dv=UiOperator.ShowCategory();
DataList1.DataSource = dv;
DataList1.DataBind();
//日志显示
DataView dv1 =UiOperator.ShowDiary();
DataList2.DataSource = dv1;
DataList2.DataBind();
//统计显示;
UiOperator ui = new UiOperator();
DataView dv2 = ui.ShowTongji();
FormView1.DataSource = dv2;
FormView1.DataBind();
//评论显示;
DataView dv3=UiOperator.ShowComment();
DataList3.DataSource = dv3;
DataList3.DataBind();
//数据释放
Program.ReleaseObject();
}
首页图如下:
diarysByCategory.aspx为日志分类显示图,diarysByCategory.aspx.cs代码如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Program.Initialization();
string cateNo = Convert.ToString(Request.QueryString["cateNo"]);
DataView dv = UiOperator.ShowDiaryByCategory(cateNo);
DataList1.DataSource = dv;
DataList1.DataBind();
DataList2.DataSource=UiOperator.ShowCategory();
DataList2.DataBind();
Program.ReleaseObject();
}
}
图如下:
diaryByCommendId.aspx,diaryByDiaryId.aspx为单篇日志页面,代码如下:
public partial class diaryByDiaryId : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Show();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
CommentEntryColl.Add(TextBox1.Text.Trim(), WebEditor1.Text, TextBox2.Text.Trim(), Session["diaryId"].ToString());
Label2.Text = "发表评论成功!";
TextBox1.Text = "";
TextBox2.Text = "";
WebEditor1.Text = "";
Show();
}
public void Show() {
Program.Initialization();
string diaryId = Convert.ToString(Request.QueryString["diaryId"]);
Session["diaryId"] = diaryId;
DataView dv = UiOperator.ShowDiaryByDiaryId(diaryId);
DataList1.DataSource = dv;
DataList1.DataBind();
DataView dv1 = UiOperator.ShowCommentByDiaryId(diaryId);
DataList2.DataSource = dv1;
DataList2.DataBind();
Program.ReleaseObject();
}
}
图如下:
由于时间原因,前台页面还没有美工,后台管理就不在这说了,主要是对数据库的一些操作。
最后,我非常希望和一些志同道合的人交流并在这条道路上走得更远.