对虚拟社区而言,帐户管理是系统安全不可或缺的部分,ASP.NET Forums也一样。
ASP.NET Forums采用以角色为中心的帐户管理模式。这种模式将系统的权限和用户分开,使用角色作为一个中间层,用户和角色的是多对多的关系,即,一个用户可以同时属于一个或多个角色,一个角色也可以同时包含一个或多个用户。用户访问某模块时,通过其所在的角色对该模块的使用权限来获得访问该模块的权限。这种分层的帐户管理模式可以实现有效的权限管理。
1. 系统设计
1.1 需求分析
帐户管理需要完成以下几个任务。
l 角色管理:添加、编辑或删除角色(即论坛中的用户自定义角色,版主,大版主,超级管理员等权限)。
l 用户管理:添加、编辑、删除或查看社区用户信息。
l 用户的登入登出:用户进入系统前,对用户输入的用户名和密码进行验证,并记录用户登录时间,用户退出系统时,清除相关cookies信息。
功能设计
l 角色管理
角色是一种用来禁止未被授权的用户进入或管理指定论坛模块的机制(权限)。用于将应用程序内具有相同权限的用户集合在一起
角色管理提供角色的添加、编辑和删除功能。
角色管理界面用表格来显示现有角色及其描述。除系统角色外,所显示的其他角色都可以被编辑或删除。在角色管理页面,还可以添加新的角色。
l 用户管理
用户管理实现用户信息的编辑、删除操作。
用户管理页面可以查看用户信息。可以选择一次查看所有用户信息或者按姓名首字母分页查看。
用户管理页面还可以对用户进行角色的添加、编辑和删除操作。
l 用户的登录登出
用户登录登出部分实现5大功能,分别是:用户登录、用户注册、修改基本信息、密码提示和用户登出。
a) 用户登录:实现用户进入系统的验证功能,并记录用户最近登录信息。
b) 用户注册:提供新用户注册功能。
c) 修改基本信息:登录进系统的用户可修改本人时区选择,语言选择,风格选择,邮件提醒等。
d) 密码提示:对忘记密码的用户用Email方式提示用户密码。
e) 用户登出:用户登出系统并清除相关cookies。
1.3 数据库设计
l 角色管理
根据系统的需求,为实现角色管理的功能,数据库中需要以下六张表。
a) 用户表(forums_Users):描述用户的基本信息,用户名,昵称,密码,密码加密格式等[用户的扩展信息是由表forums_Profile实现,在用户管理小节详解]。
b) 用户角色关系表(forums_UserInRoles):连接角色表和用户表。
c) 角色表(forums_Roles):描述用户角色。
d) 版主信息表(forums_Moderators):描述用户可以管理哪个板块。
e) 审核日志表(forums_ModerationAudit):描述版主或管理员的操作日志。
f) 版主动作表(forums_ModerationAction):描述版主或管理员可操作动作及相关性描述。
六张表的关系如图1.1所示。
图1.1 帐户管理数据库关系表
从关系图中可以看到,用户表(forums_Users)和角色表(forus_UserRoles)的多对多关系通过用户角色关系表(forums_UsersInRoles)来体现。而一个用户可以有多个分组或板块权限(用户在某个分组中具有权限则为大版主[独立角色],在某个分组的具体板块中具有权限则为版主)详细表现在(forums_Moderators)表中,而大版主或者版主的具体行为则有(forums_ModerationAction)表来标示。用户和具体版主或大版主行为描述的多对多关系通过表(forums_ModerationAudit)来体现。
1). 用户表(forums_Users)
用户表的结构如表1.1所示:
表1.1 用户表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
UserID | 社区ID | int | 4 | 否 | 是 |
UserName | 角色名 | nvarchar | 64 | 否 | 否 |
NickName | 角色昵称 | nvarchar | 64 | 是 | 否 |
Password | 角色密码 | nvarchar | 64 | 否 | 否 |
PasswordFormat | 密码格式化 | smallint | 2 | 否 | 否 |
Salt | 盐 | varchar | 24 | 否 | 否 |
PasswordQuestion | 密码提示问题 | nvarchar | 256 | 是 | 否 |
PasswordAnswer | 密码提示答案 | nvarchar | 256 | 是 | 否 |
电子邮件 | nvarchar | 128 | 否 | 否 | |
DateCreated | 用户建立时间 | datetime | 8 | 否 | 否 |
LastLogin | 最后一次登陆时间 | datetime | 8 | 否 | 否 |
LastActivity | 最后一次活动时间 | datetime | 8 | 否 | 否 |
IPCreated | 帐号建立的IP | nvarchar | 30 | 否 | 否 |
IPLastActivity | 最后一次活动IP | nvarchar | 30 | 否 | 否 |
IPLastLogin | 最后一次登陆IP | nvarchar | 30 | 否 | 否 |
IPLocation | 客户端IP | nvarchar | 50 | 否 | 否 |
LastAction | 最后一次活动描述 | nvarchar | 1024 | 是 | 否 |
UserAccountStatus | 用户状态 | smallint | 2 | 否 | 否 |
IsAnonymous | 是否匿名活动 | bit | 1 | 否 | 否 |
ForceLogin | 强制登陆 | bit | 1 | 否 | 否 |
AppUserToken | (预留字段没用到) | varchar | 128 | 是 | 否 |
Platform | 操作系统 | nvarchar | 50 | 是 | 否 |
Browser | 浏览器 | nvarchar | 50 | 是 | 否 |
PortalTheme | 用户系统扩充 | nvarchar | 50 | 是 | 否 |
用户表用来存放用户的基本信息,示例数据如图1.2所示:
2. 用户角色关系表(forums_UserInRoles)
用户角色关系表的结构如表1.2所示:
表1.2 用户角色关系表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
UserID | 用户ID | int | 4 | 否 | 否 |
RoleID | 角色ID | int | 4 | 否 | 否 |
用户角色关系表用来存放用户和角色的关系ID,示例数据如图1.3所示:
3. 角色表(forums_Moderators)
角色表的结构如表1.3所示:
表1.3 角色表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
RoleID | 角色ID | int | 4 | 否 | 是 |
Name | 角色名 | nvarchar | 256 | 否 | 否 |
Description | 角色描述 | nvarchar | 512 | 否 | 否 |
角色表用来存放相关角色的详细信息,示例数据如图1.4所示:
4. 版主信息表(forums_Moderators)
版主信息表的结构如表1.4所示:
表1.4 版主信息表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
UserID | 用户ID | int | 4 | 否 | 是 |
ForumID | 版块ID | int | 4 | 否 | 是 |
DateCreated | 建立时间 | datetime | 8 | 否 | 否 |
EmailNotification | 邮件通知 | bit | 1 | 否 | 否 |
PostsModerated |
| int | 4 | 否 | 否 |
版主信息表用来存放版主的基本信息,示例数据如图1.5所示:
5. 审核日志表(forums_ModerationAudit)
审核日志表的结构如表1.5所示:
表1.5 审核日志表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
ModerationAction | 版主操作序列 | int | 4 | 否 | 否 |
PostID | 帖子ID | int | 4 | 是 | 否 |
UserID | 用户ID | int | 4 | 是 | 否 |
ForumID | 板块ID | int | 4 | 是 | 否 |
ModeratorID | 版主ID | int | 4 | 否 | 否 |
ModeratorOn | 是否版主 | datetime | 8 | 否 | 否 |
Notes | 审核注释 | nvarchar | 1024 | 是 | 否 |
版主审核表用来存放版主的审核信息,示例数据如图1.6所示:
6. 版主动作表(forums_ModerationAction)
版主动作表的结构如表1.6所示:
表1.6 版主动作表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
ModerationAction | 版主操作序列 | int | 4 | 否 | 否 |
Description | 操作描述 | nvarchar | 128 | 否 | 否 |
TotalActions | 操作次数 | int | 4 | 否 | 否 |
版主动作表用来存放版主的操作日志,示例数据如图1.7所示:
l 用户管理
根据系统的需求,为实现角色管理的功能,数据库中需要以下十一张表。
a) 用户表(forums_Users):描述用户的用户名、用户密码等相关信息。
b) 用户与头像关系表(forums_UserAvatar):描述用户和用户头像的关系。
c) 用户头像表(forums_Images):描述用户头像信息。
d) 用户等级表(forums_Ranks):描述用户的等级。
e) 用户私人消息表(forums_PrivateMessages):描述存储用户的私人信息。
f) 用户发帖统计表(forums_statistics_User):描述用户登录后存储用户的发帖总数,在用户等出后清空。
g) 在线用户表(forums_UserOnline):描述用户是否在线。
h) 用户收藏主题表(forums_Favorites):描述用户的收藏的帖子。
i) 用户扩展信息表(forums_UserProfile):描述用户在论坛中的个人设置信息。
j) 匿名用户表(forums_AnonymousUsers):描述如果用户没有登陆而进入论坛,则存储匿名用户的信息。
k) 用户报告表(forums_Reports):描述用户向版主或管理员发布报告的表。
十一张表的关系如图1.8所示。
图1.8 用户管理数据库关系表
1) 用户表(forums_User)
上面已经介绍过(表1.1和图1.1),这里不再敖述。
2) 用户和头像关系表(forums_UserAvatar)
用户和头像关系表的结构如表1.7所示:
表1.7 用户头像表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
UserID | 用户ID | int | 4 | 否 | 否 |
ImageID | 用户头像ID | int | 4 | 否 | 否 |
用户和头像关系表用来存放用户和其头像之间的关系,示例数据如图1.9所示:
3) 用户头像表(forums_Ranks)
用户头像表的结构如表1.8所示:
表1.8 用户头像表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
ImageID | 用户头像ID | int | 4 | 否 | 是 |
Length | 用户头像长度 | int | 4 | 否 | 否 |
ContentType | 头像图片类型 | nvarchar | 64 | 否 | 否 |
Content | 图像流 | image | 16 | 否 | 否 |
DateLastUpdated | 最后一次更新时间 | datetime | 8 | 否 | 否 |
用户头像表用来存放用户头像的相关信息,示例数据如图1.10所示:
4) 用户等级表(forums_Ranks)
用户等级表的结构如表1.9所示:
表1.9 用户等级表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
RankID | 用户等级ID | int | 4 | 否 | 是 |
RankName | 用户等级描述 | nvarchar | 30 | 是 | 否 |
PostingCountMin | 最少发帖量(最小积分) | int | 4 | 是 | 否 |
PostingConntMax | 最多发帖量(最大积分) | int | 4 | 是 | 否 |
RankIconUrl | 等级图标地址 | nvarchar | 256 | 是 | 否 |
用户等级表存放有关于用户等级的相关信息,示例数据如图1.11所示
5) 用户私人消息表(forums_PrivateMessages)
用户私人消息表的结构如表1.10所示:
表1.10 用户私人消息表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
MessageID | 用户私人消息ID | int | 4 | 否 | 是 |
SenderUserID | 发送信息用户ID | int | 4 | 否 | 否 |
RecipientID | 接受信息用户ID | int | 4 | 否 | 否 |
Subject | 私人信息标题 | nvarchar | 50 | 否 | 否 |
Content | 私人信息内容 | ntext | 16 | 否 | 否 |
CreateTime | 创建时间 | datetime | 8 | 否 | 否 |
IsSenderDelete | 是否发送者删除 | bit | 1 | 否 | 否 |
IsRecipientDelete | 是否接受者删除 | bit | 1 | 否 | 否 |
IsRead | 是否读取 | bit | 1 | 否 | 否 |
IsReply | 是否回复 | bit | 1 | 否 | 否 |
用户私人信息表存放有关于用户私人消息的相关数据,示例数据如图1.12所示
6) 用户发帖统计表(forums_statistics_User)
用户发帖统计表的结构如表1.11所示:
表1.11 用户发帖统计表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
UserID | 用户ID | int | 4 | 否 | 否 |
TotalPosts | 用户发帖总数 | int | 4 | 否 | 否 |
用户发帖统计表存放有关于用户发帖总数,示例数据如图1.13所示
7) 在线用户列表(forums_UserOnline)
在线用户列表的结构如表1.12所示:
表1.12 在线用户列表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
UserID | 用户ID | int | 4 | 否 | 否 |
LastActivity | 用户最后一次活动时间 | datetime | 8 | 否 | 否 |
LastAction | 用户最后一次活动描述 | nvarchar | 1024 | 否 | 否 |
在线用户列表存放有关于用户发帖总数,示例数据如图1.14所示
8) 用户收藏主题表(forums_Favorites)
用户收藏主题表的结构如表1.13所示:
表1.13 用户收藏主题表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
UserID | 用户ID | int | 4 | 否 | 否 |
ThreadID | 帖子主题ID | int | 4 | 否 | 否 |
FavoriteDate | 收藏时间 | datetime | 8 | 否 | 否 |
用户收藏主题表存放有关于用户收藏经典帖子的具体信息,示例数据如图1.15所示
9) 用户扩展信息表(forums_UserProfile)
用户扩展信息表的结构如表1.14所示:
表1.14 用户具体设置表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
UserID | 用户ID | int | 4 | 否 | 是 |
TimeZone | 帖子主题ID | float | 8 | 否 | 否 |
TotalPosts | 发帖总数 | int | 4 | 否 | 否 |
TotalValuedPosts | 总精华数 | int | 4 | 否 | 否 |
Integral | 用户积分 | int | 4 | 否 | 否 |
PostSortOrder | 帖子排序方式 | int | 4 | 否 | 否 |
StringNameValues | 保存用户扩展属性 | varbinary | 7500 | 否 | 否 |
PostRank | 发帖等级 | binary | 1 | 否 | 否 |
IsAvatarApproved | 是否允许头像审核后才起作用 | smallint | 2 | 否 | 否 |
ModerationLevel | 新用户管理级别 | smallint | 2 | 否 | 否 |
EnableThreadTracking | 是否跟踪主题 | smallint | 2 | 否 | 否 |
EnableDisplayUnreadThreadsOnly | 是否主题不允许回复 | smallint | 2 | 否 | 否 |
EnableAvatar | 是否启用头像 | smallint | 2 | 否 | 否 |
EnableDisplayInMemberList | 是否启用在线成员列表 | smallint | 2 | 否 | 否 |
EnablePrivateMessages | 是否允许私人消息 | smallint | 2 | 否 | 否 |
EnableOnlineStatus | 是否显示在线状态 | smallint | 2 | 否 | 否 |
EnableHtmlEmail | 是否以Html格式发送邮件 | smallint | 2 | 否 | 否 |
用户扩展信息表存放关于用户个性设置的具体信息,示例数据如图1.16所示
10) 匿名用户表(forums_AnonymousUsers)
匿名用户表的结构如表1.15所示:
表1.15 匿名用户表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
UserID | 用户ID | int | 4 | 否 | 否 |
LastLogin | 最后一次登陆时间 | datetime | 8 | 否 | 否 |
IPAddress | 登陆IP地址 | nvarchar | 32 | 否 | 否 |
IPLocation | IP真实地理位置 | nvarchar | 50 | 是 | 否 |
LastAction | 最后活动状态描述 | nvarchar | 1024 | 否 | 否 |
Platform | 用户系统操作平台 | nvarchar | 50 | 是 | 否 |
Browser | 浏览器 | nvarchar | 50 | 是 | 否 |
匿名用户表存放关于用户匿名上线后的具体信息,示例数据如图1.17所示
11) 用户报告表(forums_Reports)
用户报告表的结构如表1.16所示:
表1.16 用户报告表
字段名 | 描述 | 类型 | 长度 | 是否可为空 | 是否主键 |
ReportID | 用户报告ID | int | 4 | 否 | 是 |
ReportName | 报告名称 | varchar | 20 | 否 | 否 |
Active |
| bit | 1 | 否 | 否 |
ReportCommand |
| varchar | 6500 | 是 | 否 |
ReportScript |
| text | 16 | 是 | 否 |
用户报告表存放关于用户想管理员发送报告的内容等,示例数据如图1.18所示
l 用户的登录登出
用户登入登出用到的是用户表(forums_User)介绍过(表1.1和图1.1),这里不再敖述。
匿名用户表(forums_AnonymousUsers)介绍过(表1.1和图1.1),这里不再敖述。
2.2 用户注册、密码取回、登入和登出
当一个用户执行用户注册过程的时候,系统会自动把这个用户加入到注册用户行列中。该用户填写的用户名将会是用户在论坛的唯一识别。
对于的任何投诉、问题、找回密码以及以后的一切新增功能和增值服务,均采用这个用户名处理,注册时填写的信息以保证论坛管理员能及时与用户联系即可。
当用户使用注册时填写的唯一ID和密码的时候,即可以参与论坛的讨论以及享受论坛提供的对应角色的服务,即用户登录。登出则为注销您当前的ID,一般当关闭浏览器的时候,如果没有选择记录cookie,用户会自动登出。
2.1 实现效果UI
当进入论坛主页的时候,就会看到明显的登录注册窗口,如图2.1所示(这里假设第一次登录该论坛,浏览器没有cookie记录)。
图2.1(对应工程中自定义控件:AspNetForums/Theme/default/skins/ Skin-LoginSmall.ascx)
或者点击导航栏的登录按钮会显示如图2.2所示:
图2.2(对应工程中自定义控件:AspNetForums/Theme/default/skins/ Skin-Login.ascx)
而这时并没有账号供登录,所以执行注册(或者点击导航栏的注册按钮)。如图2.3所示:
图2.3(对应工程中自定义控件:AspNetForums/Theme/default/skins/ Skin-ForgottenPassword.ascx)
“注册新用户”提供密码账号的注册(如图2.4所示)。
图2.4(对应工程中自定义控件:AspNetForums/Theme/default/skins/Skin-CreateNewAccount.ascx)
“忘记密码”则是在密码丢失的情况下使用(如图2.5所示)。
图2.5(对应工程中自定义控件:AspNetForums/Theme/default/skins/Skin-ChangePassword.ascx)
(注意:当没有登录时的导航栏如图2.6所示)
图2.6(对应工程中自定义控件:AspNetForums/Theme/default/skins/ Skin-NavigationMenu.ascx)
当按照论坛注册通过后,系统会自动按照注册的用户名和密码登录,登陆后如图2.7所示:
图2.7(对应工程中自定义控件:AspNetForums/Theme/default/skins/Skin-DisplayUserWelcome.ascx)
而原来的“新用户注册”和“密码取回”的板块则会变成图2.8所示的样子:
图2.8(对应工程中自定义控件:AspNetForums/Theme/default/skins/Skin-SearchRedirect.ascx)
[注意这时的导航栏变成了这样(如图2.9所示)]
图2.9(对应工程中自定义控件:AspNetForums/Theme/default/skins/ Skin-NavigationMenu.ascx)
而图2.8相比较2.5多出的“我的版面”“控制面板”“用户列表”则是登录之后普通用户可以享受到的服务。如果您是版主则会多出“版务管理”,最后的“注销(PrideRoCK)”则是登出按钮。
此时有关于使用到的页面控件都已经找到了,但是并没有看到代码。按照图示的顺序从一到九分别察看html代码,
图2.1: Skin-LoginSmall.ascx
图2.2: Skin-Login.ascx
图2.3: Skin-ForgottenPassword.ascx
图2.4: Skin-CreateNewAccount.ascx
图2.5: Skin-ChangePassword.ascx
图2.6: Skin-NavigationMenu.ascx
图2.7: Skin-DisplayUserWelcome.ascx
图2.8: Skin-SearchRedirect.ascx
会发现都有这样一条,
<%@ Register TagPrefix="Forums" Namespace="AspNetForums.Controls" Assembly="AspNetForums.Controls" %> |
现在打开类视图(图2.9所示),可以快速找到8个皮肤对应的control代码。
2.2 Control层
列出皮肤文件对应的control层中的类。
皮肤文件 | Control层中对应类名 |
Skin-LoginSmall.ascx | Login.cs |
Skin-Login.ascx | Login.cs |
Skin-ForgottenPassword.ascx | User ForgottenPassword.cs |
Skin-CreateNewAccount.ascx | User /CreateUser.cs |
Skin-ChangePassword.ascx | User /ChangePassword.cs |
Skin-NavigationMenu.ascx Skin-NavigationMenu.ascx(注销按钮) | Navigation /NavigationMenu.cs Logout.cs |
Skin-DisplayUserWelcome.ascx | Skins /DisplayUserWelcome.cs |
Skin-SearchRedirect.ascx | Search /SearchRedirect.cs |