我的网站开发文档

时间:2022-08-26 03:20:49
各位大大,小弟自去年11月开学C#以来,这是第一次正式开做WEB网站,同时也是第一次写开发文档,没什么经验,放上来请各位多多指正。有想拍砖的也请尽管拍,小弟也一并谢过!



WEB站点开发文档


2004年4月8日

一、目的
要建立的是一个基于内容的,模块化个人网站,这也将是我独立开发的第一个网站。
目前需要达到的要求是:
1、一个发布各类新闻的首页(模式参照CSDN的首页)。
2、一个帐号模块,负责整个站点的用户帐号管理
3、一个新闻发布系统,使用它在后台维护数据库来动态发布新闻

以上只是概述一下总体要做到的三个目标。因为是初学者,所以要求不高。

二、对站点的要求
1、可升级。现在还很简单,还没有论坛、投票、广告系统等等,在日后需要时应该能只用少量代码就将所需的功能加入,也就是说能够轻易地进行功能扩充。
2、灵活。要试图使WEB站点的基础设计保持灵活性,当日后对基础设计需求进行修改时,可以不影响到站点的其它部分。
3、代码重用。必须强调对象的层次结构、继承及重用性。要彻底地执行这一点。比如使用自定义的控件等等来达到这一要求。
4、独立性。需要具有一个坚实而独立的核心基础。此核心为站点的其它部分提供最底层的功能实现。并且离其它部分不能太近,以便修改核心时不会影响到站点的其他部分。

三、具体的开发环境及设计思路
1、环境。开发工具使用VS2003,后台数据库采用SQL2000,反正都是盗版不花钱。站点以C#及相关的各种内容为主。站点具有一个域名csharp.name。站点名字就叫“以C#之名”。目前仅是指向花生壳上的URL,日后有机会将做到完全自主解析。
2、设计思路。
  基本采用《asp.net WEB站点高级编程》里的设计思路,并参考其中的代码。甚至利用其中的资源(如图标、样式表等)。
  所有的模块都采用三层模式开发,即数据层、商务层、表示层。完全使用存储过程对数据库进行访问。
  直接把新闻发布页面做为站点的首页。参照CSDN首页的样式。
  为了能尽快建立一个网站的雏形,首页上将采用DataList控件的数据绑定模式来显示新闻。出于性能考虑,以后可能会采用由服务器控件从XML文件读取数据的形式来显示新闻。再再后可以考虑采用生成静态的纯HTML做首页。
  帐号系统在看《高级编程》之后还是不太透彻,什么用户、负责人、角色、许可搞得头都大了。但此次也将披挂上阵,希望能在实践中加深对此模块的理解。
  后台的新闻发布系统,只有新闻发布人员才能访问,因此可放心使用服务器控件,不必考虑性能方面的影响。
  
三、总体工作量的一点估计
  所需的代码基本都有参照。但彻底吃透还需要一点时间。其实算起来表示层的页面屈指可数,一个首页、帐号及登录注册系统约4个页面,新闻发布系统约4个页面,但是设计表示层不是我所擅长,可能花费不少时间。
  今天是星期四,假如明天没有太多事的话,加上两个双休日,所有代码不卡壳的话,应该在星期一以前可以完成。

四、设想的开发顺序。
1、先设计好数据库,设计好所需的表,以及两个系统所需要的所有存储过程。
2、开发核心的数据层基类,以后所有的数据类都继承自它。
3、开发几个用户控件,如站点的页眉页脚控件。
3、开发帐户系统,也就是登录及注册系统。这个比较难,因为还没彻底理解透,边理解边做,可能要花费2天的时间。
4、开发新闻发布系统。包括后台对数据库内容的维护及前台的显示新闻页面。

26 个解决方案

#1


没有图不算文档。

#2


"今天是星期四,假如明天没有太多事的话,加上两个双休日,所有代码不卡壳的话,应该在星期一以前可以完成。
"

nb

#3


就这么一点?

#4


是啊,难道还要很多吗?

#5


呵呵,我认为多用点书面语应该比这个好点

#6


"今天是星期四,假如明天没有太多事的话,加上两个双休日,所有代码不卡壳的话,应该在星期一以前可以完成。"

你的文档“比较好理解”,呵呵
还是像楼上说的那样,用书面语吧

#7


没有工作流程图呢

#8


像个日记

#9


写个策划书吧!!!这太简单了

#10


什么是书面语,是不是很正式的那种。。。

#11


up

#12


呵呵。有意思。学学。

#13


反正都是盗版不花钱  ^_^

#14


这最多算需求文档,MRS,从MRS到PES再到PIS,路还很长DI

#15


up

#16


rexsp
 
 
  这最多算需求文档,MRS,从MRS到PES再到PIS,路还很长DI

---------------------------------------------
这位大大,什么是MRS PES PIS ,说实话小弟连听都没听过,惭愧啊。。。狂寒~~~
  
 

#17


4月9日

网站的命名空间规划。

根命名空间为
CSharp.Name
其下又划分两个命名空间:Web与WebModule
Web命名空间,它保存了站点最基本(也是最核心?)的部分,如页面、各种自定义的控件、导航栏等
WebModule命名空间,保存了独立于站点核心之外的各种功能模块,但同时与站点紧密结合,以后可不断加入新模块来扩充站点功能。目前仅具有的模块是Accounts(帐号)与NewsManager(新闻管理及发布),同时数据层的核心模块Data也在其中。

具体的编码工作。
1、数据库表。
  首先是帐号系统。因为是基于身份的验证系统,不同的用户可以分配不同的角色,而每个角色又拥有不同的许可,需要的表如下:Users、Roles、Permissions。User表保存用户的详细资料,Role保存角色资料,Permissions保存许可资料。
  Users字段如下:
UserID (int)
Password (string)
Name (string)
Email (string)
以上为必填字段,还有一些可不填字段
Address (string)
Country (string)
HomePage (string)
Sex (byte)
Birthday (dateTime)
ZipCode (string)
Phone (string)
Job (string)

  Roles字段如下:
RoleID (int)
Description (string)
  Permission字段如下:
PermissionID (int)
Description (string)

  还需要一个UsersRoles表,这是一个Users与Roles的交叉映射表,分别由两表的外键来组成复合主键。相似地,还有一个RolesPermissions表,是Roles与Permissions表的交叉映射表。不需要许可类别表。
  UsersRoles字段:
UserID(int)
RoleID(int)
  RolesPermissions字段:
RoleID(int)
PermissionID(int)

2、存储过程。
  接下来是帐号系统所需的存储过程。为了与其他模块的存储过程区分来,加有前缀Account。具体如下:
  
  操作用户方面
  AccountCreateUser 创建新用户
  AccountDeleteUser 删除一个用户
  AccountUpdateUser 更新指定用户资料
  AccountGetAllUsers 获取系统全部的用户
  AccountGetUserDetails 获取指定用户的详细资料 
  AccountGetAllRolesFromUser 获取指定用户具有的所有角色
  AccountGetAllPermissionsFromUser 获取指定用户的所有许可

  操作许可方面
  AccountCreatePermission 创建一个新的许可
  AccountDeletePermission 删除指定的许可
  AccountUpdatePermission 更新指定的许可
  AccountGetAllPermissions 获取全部的许可
  AccountGetPermissionDetails 获取指定许可的详细资料

  操作角色方面
  AccountCreateRole 创建一个新角色
  AccountDeleteRole 删除一个角色
  AccountUpdateRole 更新一个角色的资料
  AccountGetAllRoles 获取全部的角色
  AccountGetRoleDetails 获取指定角色的详细资料
  AccountGetAllUsersFromRole 获取指定角色的所有用户
  AccountGetAllPermissionsFromRole 获取指定角色的所有许可
  
  AccountAddUserToRole 向指定角色添加指定的用户
  AccountRemoveUserFromRole 从指定角色删除指定的用户
  AccountAddPermissionToRole 向指定角色添加指定许可
  AccountRemovePermissionFromRole 从指定角色删除指定的许可
  AccountClearUsersFromRole 删除指定角色下的所有用户
  AccountClearPermissionsFromRole 删除指定角色下的所有许可


  存储过程较多,今天又忙了一天挺累的,估计需要一整晚才能完成。


#18


呵呵,果然按时完成了规划的工作
一切都按照文档的进度进行,存储过程在开发过程中出现了一点小意外,因为实际编码的时候才发现许可要由管理员来操作,在程序中添加和修改许可没什么意义。于是去掉了三个存储过程:
  AccountCreatePermission 创建一个新的许可
  AccountDeletePermission 删除指定的许可
  AccountUpdatePermission 更新指定的许可

同时又增加了几个存储过程,它们的功能都是在写文档时考虑不周全漏掉的:
  AccountGetUserDetailsByName 根据用户注册名来获取用户的详细资料
  AccountGetUserDetailsByEmail 根据Email来获取用户的详细资料
  AccountClearRolesFromUser 删除指定用户的所有角色
  AccountValidateLogin 验证登录的用户


唉,补这补那,可能叫开发日记更适合吧:)有点累~~,睡觉去也

#19


继续呀
支持

#20


谢谢楼上,偶会努力DI!:)

#21


4月10日

又是新的一天了,今天的日程还蛮紧。
按照规划,今天要完成整个帐号系统的开发。昨天已经完成了存储过程,剩下要做的有四个方面:
1、核心层。这里完全参照《高级编程》的代码,包括一个最底层的Data命名空间,在里面实现一个专门用来执行存储过程的DbObjcet类,以后所有模块的数据层类都继承自它。它最重要的功能就是提供4个执行存储过程的重载方法。

2、帐号的数据层。在这里完成对各种存储过程的调用,并向返回数据集或记录行或数字供商务层使用。

3、帐号系统的商务层。在这里完成对各种业务逻辑的运算。例如将查询或操作数据库的结果进行归纳、整理等等琐碎事情。基本上只需简单调用数据层对象即可。一个重要目前的业务逻辑是对表示层取得的用户密码进行加密。PS:书上有个用SHA1加密的方法,但这是不可逆的,为了实现用户忘记密码并可取回密码的功能,决定修改一下数据库的Users表,增加密码提示问题等字段,对它做近一步完善,当然不一定要现在就实现,以后有时间再做也是可以的。
  

4、帐号系统的表示层。大约需3个页面:登录、用户帐号的管理(显示及修改个人信息)、管理员页面(可操作用户、角色、许可)。这是一个需要花费大时间的地方,因为对怎么画网页不擅长,估计需要一下午的时间。

晚上若有富余时间,将立即着手新闻发布系统的存储过程开发。因为时间紧迫啊。。。尤其是那个新闻发布的首页,凭偶这水平,要想画得跟CSDN有三分似也得花大气力~~

#22


4月10日下午,最新的一点文档补充
帐号系统的数据层由三个类User、Role、Permission构成,命名空间为CSharp.Name.WebModules.Account.Data,均继承自核心层的DbOject类。
User类要实现的方法有
Create方法 在数据库创建一个新用户,并返回创建后的用户ID。如果此用户名已经存在,返回-100
RetrieveByID 通过用户ID获取指定的用户资料,返回的是DataRow实例
RetrieveByName 通过用户名获取用户资料,返回的是DataRow实例
RetrieveByEmail 通过用户邮箱获取用户资料,返回的是DataRow实例
Update方法 更新指定用户的资料(通过用户ID)
Delete方法 删除指定用户
GetAllUsers方法 返回一个DataSet,包括系统的所有用户的完全列表
GetUserRoles方法 返回指定用户的角色列表
GetUserPermissions 返回指定用户的许可列表
ValidateLogin方法 返回一个int,验证通过为用户的ID,否则为-1
    TestPassword方法 返回一个bool,指示用户ID与密码是否匹配
ClearAllRoles方法 清除此用户的所有角色

Role类要实现的方法有
Create方法 创建一个新的角色,返回创建后的角色ID,若此角色已经存在,返回-100
GetRoleUsers方法 获取指定角色下的所有用户,以SqlDataReader形式
GetRolePermissions方法 获取指定角色下的所有许可,以ArrayList形式
GetAllRoles方法 获取系统中的所有角色列表
RetrieveByID 通过角色ID获取角色的详细资料
Update方法 更新指定角色的说明
Delete方法 删除一个角色
AddUser方法 向指定角色添加一个用户
AddPermission方法 向指定角色添加一个许可 
RemoveUser方法 从指定角色中删除一个用户
RemovePermission方法 从指定角色中删除一个许可
ClearAllUsers方法 清除此角色的所有用户
ClearAllPermissions方法 清除此角色的所有许可

Permission类要实现的方法有
RetrieveByID 通过ID取得指定许可的资料
GetAllPermissions 取得系统所有的许可列表

4月10日晚上,需要完成帐号系统的商务层类。
照目前的进度看来,我是太乐观了,没想到一个数据层就耗了一整天的时间。今晚能完成商务层就不错了。
帐号系统的商务层由4个类构成,其中有2个类实现安全验证系统:SitePrincipal与SiteIdentity,另2个类是User与Role
在这一层里,User与Role类开始具有属性。
User类并不参与验证工作,它只是用来加载并保存用户的信息,同时对用户进行一些操作,如创建、更新与删除。
它需要的方法:
Create 请求数据层创建新用户
Update 基于属性值将当前用户的信息更新
User(int) 构造函数,通过用户ID取得用户的资料
User(SitePrincipal) 基于SitePrincipal类的实例来创建一个新的用户实例,也就是读取当前登录用户的资料
它具有的属性就不详列了


Role类与User类相似,不过它操作的是角色,并可以操作角色所拥有的许可。

SitePrincipal类,继承并实现Iprincipal接口。因为HttpContext.User对象也同样继承自Iprincipal接口
SiteIdentity类,继承并实现Iidentity接口。
一直以来我都不太搞得清Principal与Identity的含义。不过现在似乎有点明白了,感觉把它们想像成另一种角色与用户的关系就很好理解,Principal就是角色,而Identity就是角色里的用户。

同时在还需要一个模块配置层。这是独立于其它三个层之外的,通过并行化及串行化XML文件来为数据层商务层提供连接字符串。这样可以方便地在外部修改XML文件来改变连接字符串

全要用手一个一个敲出来,已经有点背不住 了~~

#23


并行化及串行化XML文件?序列化,反序列化吧。

#24


串行并行也没有错啊楼上~~

#25


该回复于2016-01-04 00:01:53被版主删除

#26


mark

#1


没有图不算文档。

#2


"今天是星期四,假如明天没有太多事的话,加上两个双休日,所有代码不卡壳的话,应该在星期一以前可以完成。
"

nb

#3


就这么一点?

#4


是啊,难道还要很多吗?

#5


呵呵,我认为多用点书面语应该比这个好点

#6


"今天是星期四,假如明天没有太多事的话,加上两个双休日,所有代码不卡壳的话,应该在星期一以前可以完成。"

你的文档“比较好理解”,呵呵
还是像楼上说的那样,用书面语吧

#7


没有工作流程图呢

#8


像个日记

#9


写个策划书吧!!!这太简单了

#10


什么是书面语,是不是很正式的那种。。。

#11


up

#12


呵呵。有意思。学学。

#13


反正都是盗版不花钱  ^_^

#14


这最多算需求文档,MRS,从MRS到PES再到PIS,路还很长DI

#15


up

#16


rexsp
 
 
  这最多算需求文档,MRS,从MRS到PES再到PIS,路还很长DI

---------------------------------------------
这位大大,什么是MRS PES PIS ,说实话小弟连听都没听过,惭愧啊。。。狂寒~~~
  
 

#17


4月9日

网站的命名空间规划。

根命名空间为
CSharp.Name
其下又划分两个命名空间:Web与WebModule
Web命名空间,它保存了站点最基本(也是最核心?)的部分,如页面、各种自定义的控件、导航栏等
WebModule命名空间,保存了独立于站点核心之外的各种功能模块,但同时与站点紧密结合,以后可不断加入新模块来扩充站点功能。目前仅具有的模块是Accounts(帐号)与NewsManager(新闻管理及发布),同时数据层的核心模块Data也在其中。

具体的编码工作。
1、数据库表。
  首先是帐号系统。因为是基于身份的验证系统,不同的用户可以分配不同的角色,而每个角色又拥有不同的许可,需要的表如下:Users、Roles、Permissions。User表保存用户的详细资料,Role保存角色资料,Permissions保存许可资料。
  Users字段如下:
UserID (int)
Password (string)
Name (string)
Email (string)
以上为必填字段,还有一些可不填字段
Address (string)
Country (string)
HomePage (string)
Sex (byte)
Birthday (dateTime)
ZipCode (string)
Phone (string)
Job (string)

  Roles字段如下:
RoleID (int)
Description (string)
  Permission字段如下:
PermissionID (int)
Description (string)

  还需要一个UsersRoles表,这是一个Users与Roles的交叉映射表,分别由两表的外键来组成复合主键。相似地,还有一个RolesPermissions表,是Roles与Permissions表的交叉映射表。不需要许可类别表。
  UsersRoles字段:
UserID(int)
RoleID(int)
  RolesPermissions字段:
RoleID(int)
PermissionID(int)

2、存储过程。
  接下来是帐号系统所需的存储过程。为了与其他模块的存储过程区分来,加有前缀Account。具体如下:
  
  操作用户方面
  AccountCreateUser 创建新用户
  AccountDeleteUser 删除一个用户
  AccountUpdateUser 更新指定用户资料
  AccountGetAllUsers 获取系统全部的用户
  AccountGetUserDetails 获取指定用户的详细资料 
  AccountGetAllRolesFromUser 获取指定用户具有的所有角色
  AccountGetAllPermissionsFromUser 获取指定用户的所有许可

  操作许可方面
  AccountCreatePermission 创建一个新的许可
  AccountDeletePermission 删除指定的许可
  AccountUpdatePermission 更新指定的许可
  AccountGetAllPermissions 获取全部的许可
  AccountGetPermissionDetails 获取指定许可的详细资料

  操作角色方面
  AccountCreateRole 创建一个新角色
  AccountDeleteRole 删除一个角色
  AccountUpdateRole 更新一个角色的资料
  AccountGetAllRoles 获取全部的角色
  AccountGetRoleDetails 获取指定角色的详细资料
  AccountGetAllUsersFromRole 获取指定角色的所有用户
  AccountGetAllPermissionsFromRole 获取指定角色的所有许可
  
  AccountAddUserToRole 向指定角色添加指定的用户
  AccountRemoveUserFromRole 从指定角色删除指定的用户
  AccountAddPermissionToRole 向指定角色添加指定许可
  AccountRemovePermissionFromRole 从指定角色删除指定的许可
  AccountClearUsersFromRole 删除指定角色下的所有用户
  AccountClearPermissionsFromRole 删除指定角色下的所有许可


  存储过程较多,今天又忙了一天挺累的,估计需要一整晚才能完成。


#18


呵呵,果然按时完成了规划的工作
一切都按照文档的进度进行,存储过程在开发过程中出现了一点小意外,因为实际编码的时候才发现许可要由管理员来操作,在程序中添加和修改许可没什么意义。于是去掉了三个存储过程:
  AccountCreatePermission 创建一个新的许可
  AccountDeletePermission 删除指定的许可
  AccountUpdatePermission 更新指定的许可

同时又增加了几个存储过程,它们的功能都是在写文档时考虑不周全漏掉的:
  AccountGetUserDetailsByName 根据用户注册名来获取用户的详细资料
  AccountGetUserDetailsByEmail 根据Email来获取用户的详细资料
  AccountClearRolesFromUser 删除指定用户的所有角色
  AccountValidateLogin 验证登录的用户


唉,补这补那,可能叫开发日记更适合吧:)有点累~~,睡觉去也

#19


继续呀
支持

#20


谢谢楼上,偶会努力DI!:)

#21


4月10日

又是新的一天了,今天的日程还蛮紧。
按照规划,今天要完成整个帐号系统的开发。昨天已经完成了存储过程,剩下要做的有四个方面:
1、核心层。这里完全参照《高级编程》的代码,包括一个最底层的Data命名空间,在里面实现一个专门用来执行存储过程的DbObjcet类,以后所有模块的数据层类都继承自它。它最重要的功能就是提供4个执行存储过程的重载方法。

2、帐号的数据层。在这里完成对各种存储过程的调用,并向返回数据集或记录行或数字供商务层使用。

3、帐号系统的商务层。在这里完成对各种业务逻辑的运算。例如将查询或操作数据库的结果进行归纳、整理等等琐碎事情。基本上只需简单调用数据层对象即可。一个重要目前的业务逻辑是对表示层取得的用户密码进行加密。PS:书上有个用SHA1加密的方法,但这是不可逆的,为了实现用户忘记密码并可取回密码的功能,决定修改一下数据库的Users表,增加密码提示问题等字段,对它做近一步完善,当然不一定要现在就实现,以后有时间再做也是可以的。
  

4、帐号系统的表示层。大约需3个页面:登录、用户帐号的管理(显示及修改个人信息)、管理员页面(可操作用户、角色、许可)。这是一个需要花费大时间的地方,因为对怎么画网页不擅长,估计需要一下午的时间。

晚上若有富余时间,将立即着手新闻发布系统的存储过程开发。因为时间紧迫啊。。。尤其是那个新闻发布的首页,凭偶这水平,要想画得跟CSDN有三分似也得花大气力~~

#22


4月10日下午,最新的一点文档补充
帐号系统的数据层由三个类User、Role、Permission构成,命名空间为CSharp.Name.WebModules.Account.Data,均继承自核心层的DbOject类。
User类要实现的方法有
Create方法 在数据库创建一个新用户,并返回创建后的用户ID。如果此用户名已经存在,返回-100
RetrieveByID 通过用户ID获取指定的用户资料,返回的是DataRow实例
RetrieveByName 通过用户名获取用户资料,返回的是DataRow实例
RetrieveByEmail 通过用户邮箱获取用户资料,返回的是DataRow实例
Update方法 更新指定用户的资料(通过用户ID)
Delete方法 删除指定用户
GetAllUsers方法 返回一个DataSet,包括系统的所有用户的完全列表
GetUserRoles方法 返回指定用户的角色列表
GetUserPermissions 返回指定用户的许可列表
ValidateLogin方法 返回一个int,验证通过为用户的ID,否则为-1
    TestPassword方法 返回一个bool,指示用户ID与密码是否匹配
ClearAllRoles方法 清除此用户的所有角色

Role类要实现的方法有
Create方法 创建一个新的角色,返回创建后的角色ID,若此角色已经存在,返回-100
GetRoleUsers方法 获取指定角色下的所有用户,以SqlDataReader形式
GetRolePermissions方法 获取指定角色下的所有许可,以ArrayList形式
GetAllRoles方法 获取系统中的所有角色列表
RetrieveByID 通过角色ID获取角色的详细资料
Update方法 更新指定角色的说明
Delete方法 删除一个角色
AddUser方法 向指定角色添加一个用户
AddPermission方法 向指定角色添加一个许可 
RemoveUser方法 从指定角色中删除一个用户
RemovePermission方法 从指定角色中删除一个许可
ClearAllUsers方法 清除此角色的所有用户
ClearAllPermissions方法 清除此角色的所有许可

Permission类要实现的方法有
RetrieveByID 通过ID取得指定许可的资料
GetAllPermissions 取得系统所有的许可列表

4月10日晚上,需要完成帐号系统的商务层类。
照目前的进度看来,我是太乐观了,没想到一个数据层就耗了一整天的时间。今晚能完成商务层就不错了。
帐号系统的商务层由4个类构成,其中有2个类实现安全验证系统:SitePrincipal与SiteIdentity,另2个类是User与Role
在这一层里,User与Role类开始具有属性。
User类并不参与验证工作,它只是用来加载并保存用户的信息,同时对用户进行一些操作,如创建、更新与删除。
它需要的方法:
Create 请求数据层创建新用户
Update 基于属性值将当前用户的信息更新
User(int) 构造函数,通过用户ID取得用户的资料
User(SitePrincipal) 基于SitePrincipal类的实例来创建一个新的用户实例,也就是读取当前登录用户的资料
它具有的属性就不详列了


Role类与User类相似,不过它操作的是角色,并可以操作角色所拥有的许可。

SitePrincipal类,继承并实现Iprincipal接口。因为HttpContext.User对象也同样继承自Iprincipal接口
SiteIdentity类,继承并实现Iidentity接口。
一直以来我都不太搞得清Principal与Identity的含义。不过现在似乎有点明白了,感觉把它们想像成另一种角色与用户的关系就很好理解,Principal就是角色,而Identity就是角色里的用户。

同时在还需要一个模块配置层。这是独立于其它三个层之外的,通过并行化及串行化XML文件来为数据层商务层提供连接字符串。这样可以方便地在外部修改XML文件来改变连接字符串

全要用手一个一个敲出来,已经有点背不住 了~~

#23


并行化及串行化XML文件?序列化,反序列化吧。

#24


串行并行也没有错啊楼上~~

#25


该回复于2016-01-04 00:01:53被版主删除

#26


mark