1、首先根据对其业务逻辑的分析极其全面整合,加之我们所熟悉的QQ聊天技术。第一应该做的是界面,界面的美化程度直接反映着用户对此软件喜欢程度,所以借助了互联网搜索了一些好看的图片;2:对界面的设计,这里所用到的就是C#里布局控件,精心的布局,这一点众所周之C#里丰富的控件为我们提供了方便,这样做就可以尽可能的让用户用起来比较舒服;3:各个窗体画好后,接下来自然就是业务逻辑层的代码书写了,由于学习不够精,所以在书写代码方便并没有用到三层技术,但是本人对该系统考虑的比较全面,一些错误和异常都可以将其打印出来书写代码比较规范,不管从类的书写,还是一些命名都非常规范;C#里提供丰富的控件库,本来就可以自动生
2、成一些代码,对业务逻辑比较明朗,对方法和类之间的命名比较规范,书写代码自然比较快,出错率比较少;方法就是增删改查,最后结合数据库技术完成业务逻辑。3 数据库概念结构设计3.1 构思E-R图原则原则1:能独立存在的事物,例如人、物、事、活动、事项等等,在其有多个基本项描述的特性需要关注时,就应把它作为实体。根据原则1,分析本系统中的实体主要有用户、星座、信息类型、聊天信息、好友策略、好友和血型。原则2:两个或多个实体间的关联与结合,如主管、从属、组成、占有、作用、配合、协同等等,当需要予以关注时,应作为联系。联系通常是某类行为动作,E-R图关注的是其状态与结果而非其过程。根据原则2,对本系统间的
3、实体之间的关联进行分析,用户与星座、血型、好友策略之间有组成与被组成的关系;在这里解释一下所谓的好友策略,我们在聊天时,别人可能会加我们为好友,我们可以不通过系统的提示,自动允许,这是一种策略。另外一种策略就是别人要加我们为好友时,先通过系统信息请求我们是否同意。此外,QQ消息和消息类型之间也有组成与被组成的关系。原则3:实体的属性是实体的本质特征。实体应有标识属性,并指定其中一个作为主标识。联系的属性是联系的结果或状态。属性具有如下几个特点:非多值性、非复合性、非导出性。实体的属性还应有非关联性。根据原则3,分析本系统中的实体属性。QQ用户的属性包括QQ号(标识属性)、QQ密码、用户昵称、用
4、户真实姓名、性别和年龄等;星座的属性包括星座的编号(标识属性)和名称;血型的属性包括血型编号(标识属性)和名称;好友策略的属性包括策略编号(标识属性)和策略名称;消息类型包括消息类型编号(标识属性)和消息类型名称;QQ消息的属性包括消息记录编号(标识属性)、消息记录名称、消息接受状态和接发消息的时间原则4:所有基本项在同一E-R图中作为属性要在仅在一个地方出现5。3.2设计E-R图 根据构思E-R图的原则联系本系统的需求分析,将数据库中所涉及的各个实体与它们各自的属性以及各个实体之间的关联用E-R图的形式表现出来,实体用方形表示,属性用椭圆表示,关联关系用没有箭头的直线连接,具体如下图3.1所
5、示:图3.1 QQ系统E-R图3.3 E-R图向关系模型转换原则 (1) 一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,每个实体的码均是关系的候选码。如果与某一端实体对应的关系模式合并,则需要在改关系模式的属性中加入另一个关系模式的码和联系本身的属性。 (2)一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。 (3)一个m:
6、n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,各实体的码组成关系的码或关系码的一部分。 (4)3个或3个以上实体间的一个多元联系可以转换为一个关系模式。 (5)具有相同码的关系模式可合并6。 根据这5项实体间的联系将上述E-R图转换为关系模型QQ消息(消息记录编号、消息、消息接受状态、发消息时间)此为消息实体对应的关系模式,该关系模式已包含了联系“组成”所对应的关系模式。消息类型(消息类型编号、消息类型名称)此为消息类型实体对应的关系模式,该关系模式已包含了联系“组成”所对应的关系模式。用户(QQ号、QQ密码、昵称、真实姓名、年龄、性别)此为用户实体对
7、应的关系模式,该关系模式已包含了联系“组成”所对应的关系模式。星座(星座编号、星座名称)此为星座实体对应的关系模式,该关系模式已包含了联系“组成”所对应的关系模式。血型(血型编号、血型名称)此为血型实体对应的关系模式,该关系模式已包含了联系“组成”所对应的关系模式。好友策略(好友策略编号、好友策略名称)此为好友策略实体对应的关系模式,该关系模式已包含了联系“组成”所对应的关系模式。4 数据库逻辑结构设计4.1 数据库需求分析针对自己所要设计的仿QQ聊天系统的需求,设计如下所示的数据项和数据结构:用户表:QQ号码、QQ密码、加好友的方式编号、昵称、QQ头像编号、性别、年龄、实姓名、星座编号、血型
8、编号星座表:星座编号、星座名称信息类型表:信息类型编号、信息类型聊天信息表:聊天信息表记录编号、发送信息者QQ号、收到信息者QQ号、发送信息、信息类型编号、信息状态、发送时间好友策略表:加好友的方式编号、加好友的方式设置好友表:表添加记录、发送者的QQ、好友的QQ血型表:血型编号、血型 以上内容如图4.1所示: 图4.1 数据流图根据本系统的业务逻辑关系,得出了此数据流图,每一个箭头都带表着数据的流向,而数据的流向直接反映给数据库,并将此信息保存在数据库,从而比较正确的设计出数据库。4.2 数据库初步关系框架User(用户表)( QQ号码、QQ密码、加好友的方式编号、昵称、QQ头像编号、性别、
9、年龄、真实姓名、星座编号、血型编号)Star(星座表)(星座编号、星座名称)MessageType(信息类型表)( 信息类型编号、信息类型)Messages(聊天信息表)( 聊天信息表记录编号、发送信息者QQ号、收到信息者QQ号、发送信息、信息类型编号、信息状态、发送时间)FriendshipPolicy(好友策略表)( 加好友的方式编号、加好友的方式设置)Friends(好友表)( 表添加记录、发送者的QQ、好友的QQ)BloodType(血型表)( 血型编号、血型)4.3数据库关系模式优化该系统的数据库设计是满足数据库设计的第三范式。在设计数据库的时候例如对本数据库中任意一个表,例如用户表
10、;在关系模式R中的每一个具体关系r中,如果每个属性值 都是不可再分的最小数据单位,则称R是第一范式的关系。例如QQ号码,用户昵称,用户真实姓名,年龄(一个人可能只有一个用户昵称,一个QQ号码,用户的编号,一个姓名,电话号码)如果一是重复存储用户的QQ号码和姓名。这样,关键字只能是用户的编号。很显然这种方法是不可取的;如果用户的QQ号码是关键字,电话号码分为单位电话和住宅电话两个属性。所以说:用户表中的列是不可再分的(即列的原子性),则可以说明该表满足第一范式!如果关系模式R(U,F)中的所有非主属性都完全依赖于任意一个候选关键字,则称关系R 是属于第二范式的。还拿出上面所说的用户表,例如每个用
11、户都自己的详细信息(即,例如qq的头像编号,血型,星座)那么我们可以简单的举几个例子就可以很简单的看出;a. 数据冗余,假设同一种血型由50个学生都一样,那么血型就重复了50次。b. 更新异常,若调整了某种血型,相应的元组血型值都要更新,有可能会出现血型的不同。c. .插入异常,如果科学家研究出来一种新的血型,由于没人选修,没有qq号作为关键字,只能等有人选修才能申请qq和录入血型成功。d. 删除异常,如果qq管理员要删除过期的qq或者是很久没有人用的qq,从当前数据库删除选修记录。那么刚要申请qq号的人,则申请的qq号和个人的血型都无法保存。原因是:血型都要依赖于血型的编号。解决方法:分成两
12、个关系模式分别在用户表血型编号,和血型表中的血型编号建立关系,即需要时再进行自然联接,恢复了原来的关系7。所以说综合上面所叙述,此数据库满足第二范式。如果关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递信赖,则称关系R是属于第三范式的。仍然按照上面的例子来说明,即例如每个用户都自己的详细信息(即,例如qq的头像编号,血型,星座)如果只按照qq作为关键字,没有部分依赖的问题,肯定是2NF。但这关系肯定有大量的冗余,有关用户属性将重复存储,插入,删除和修改时也将产生类似以上例的情况。原因:关系中存在传递依赖造成的。假如要插入星座中的白马座,显然它不属于12星座,这样插入很显然是不会
13、成功的,关键是用户星座的编号和星座表中的编号相互联系起来的,也就是函数决定是通过传递依赖。解决目地:每个关系模式中不能留有传递依赖。这样就满足了第三范式!这样做的目的就是:规范化目的是使结构更合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新 原则:遵从概念单一化 一事一地原则,即一个关系模式描述一个实体或实体间的一种联系。规范的实质就是概念的单一化8。就是增加系统的稳定性以及系统的成本和后期的维护。 方法:将关系模式投影分解成两个或两个以上的关系模式。要求:分解后的关系模式集合应当与原关系模式等价,即经过自然联接可以恢复原关系而不丢失信息,并保持属性间合理的联系。从而在建立数据逻辑时
14、能够更加清晰明白避免数据的冗杂,降低了出错的可能性使得该系统更加可靠。通过上面的数据库关系优化之后我们就可以很简单的写出逻辑关系。4.4 具体逻辑模式设计表4.1 用户表Users字段字段类型字段描述IdintQQ号码(主键)LoginPwdvarcharQQ密码FriendshipPolicyId加为好友的方式编号NickName昵称FaceIdQQ头像的编号Sex性别Age年龄Name真实姓名StarId星座编号BloodTypeId血型编号表4.2 星座表Star星座编号(主键)Star星座名称表4.3信息类型表MessageType信息类型编号(主键) MessageType信息的类型
15、表4.4聊天信息表Messages聊天信息表记录编号(主键) FromUserId发送信息者QQ号(外键) 续表4.4ToUserId收到信息者的QQ号(外键)Message发送的信息MessageTypeId信息的类型编号MessageState信息的状态(被接收到为1)MessageTimedatetime发送的时间表4.5好友策略表FriendshipPolicy加为好友的方式编号(主键) FriendshipPolicy加为好友的方式的设置表4.6好友表Friends好友表表添加的记录(主键)HostId发送者的QQ(外键)FriendId好友的QQ(外键)表4.7血型表BloodTy
16、pe血型编号(主键)BloodType血型4.5 数据库设计表在上述每张表中,第一个数据都作为自己所在表的主键,而在表与表之间也有主外键关系存在,对用户表和星座表来说,星座表是主键表,用户表是外键表;对用户表和血型表来说,血型表是主键表,用户表是外键表;对用户表和好友策略表来说,好友策略表是主键表,用户表是外键表;对聊天信息表和信息类型表来说,信息类型表是主键表,聊天信息表是外键表。 表4.8 设计表Users 表4.9 设计表BloodType 表4.10 设计表Friends 表4.11 设计表FriendshipPolicy 表4.12 设计表Messages 表4.13 设计表Mess
17、ageType表4.4 设计表Star4.6 关系图图4.2 关系图5 程序实现51界面和系统设计 该界面用户可以申请号码,然后注册自己的基本信息,若注册成功就可得到一个QQ号码,并根据此号码加上自己在注册基本资料时注册的密码就可以实现用户的登录,具体操作见下列各图5.1到图5.14所示:图5.1 用户登录运行界面具体实现:在Visual Studio.NET2005的Windows应用程序里面,首先创建一个名为“MyQQ用户登录”的主窗体,然后按照需要的功能拖控件,如果用户名和密码为空:图5.2 登录提示界面 1MessageBox.Show(请输入登录的号码, 登录提示, MessageB
18、oxButtons.OK, MessageBoxIcon.Information);txtLoginId.Focus();如果密码有错:则由图5.3所示:图5.3 登录提示界面 2具体实现代码如下:请输入密码如果用户名和密码都对: return false; return true; 图5.4 申请号码的运行界面创建“申请号码”主窗体,此窗体由三部分组成,具体操作同上,部分涉及数据库信息的代码如下: / 查询星座用的sql语句 string sql = SELECT Star FROM Star;/ 修改查询语句,查询血型 sql = SELECT BloodType FROM BloodTy
19、pe/ 获得血型的Id bloodTypeId = GetBloodType(); sql = string.Format(INSERT INTO Users (LoginPwd, NickName, Sex, Age, Name, StarId, BloodTypeId) values (0,12,3,4,5,6), txtLoginPwd.Text.Trim(), txtNickName.Text.Trim(), sex, int.Parse(txtAge.Text.Trim(), txtName.Text.Trim(), starId, bloodTypeId); / 获得星座的Id s
20、tarId = GetStarId();INSERT INTO Users (LoginPwd, NickName, Sex, Age, Name, StarId) values (, 5) txtLoginPwd.Text.Trim(), txtNickName.Text.Trim(), sex, int.Parse(txtAge.Text.Trim(), txtName.Text.Trim(),starId);图5.5 登录后运行界面此界面具体功能未能实现。52 界面具体操作打开用户登录,申请号码注册: 图5.6 用户登录点击申请号码以后,注册自己的基本信息,包括昵称、年龄、性别、密码、真
21、实姓名、星座和血型。图5.7 用户注册界面注册成功后,将获得提示。如图5.8所示:图5.8 注册成功提示注册成功以后,用申请的号码和自己的密码进行登录。如图5.9所示:图5.9 用户登录界面如果用户名和密码有错则会:如图5.10所示: 图5.10 用户登录出错 MessageBox.Show(其效果图如图5.11所示:图5.11 用户登录成功后的主窗体好友列表第三方控件运用了第三方SideBar/ 命名空间 using Aptech.UI;/ 添加组 sbFriends.AddGroup(我的好友);陌生人/ 添加项 SbItem item = new SbItem(string)dataRe
22、aderNickName, sbFriends.Groups0.Items.Add(item);如果要添加好友的话:将通过三步来实现。a 查找 如图5.12所示b 添加 如图5.13所示c 反馈成功信息 如图5.14所示图5.12 查找好友图5.13 好友列表图5.14 加载好友已经存在 / 添加好友 private void btnAdd_Click(object sender, EventArgs e) int friendshipPolicyId = -1; / 对方的好友策略 int friendId = GetSelectedFriendId(); / 获得选中的好友的Id / 是否有可添加的好友 if (friendId = -1) MessageBox.Show(请选择一个好友!提示 return; else if (friendId = UserHelper.loginId)不能加自己为好友! else if (HasAdded(friendId) / 确认是否需要添加(是否已经是好友了) 对方已在你的好友列表中! / 确认对方能否被加为好友 friendshipPolicyId = GetFriendshipPolicyId(friendId); if (friendshipPolicyId = 3) / 3表示不允许任何人添加,在S2可以使用常量
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1