• 797.69 KB
  • 2022-05-17 13:29:37 发布

公司考勤管理系统设计本科毕业设计论文

  • 69页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
屢東目畀至大孚GUANGDONGUNIVERSITVOFFINANCE&ECONOMICS广东商学院2014-JX16・本科毕业论文(设计)公司考勤管理系统设计及实现院(系)信息学院专业软件工程学号学生姓名指导教师提交日期 毕业论文(设计)成绩评定表毕业论文(设计)指导教师评语及成绩成绩指导教师签名年月日毕业论文(设计)复评教师评语及成绩成绩复评教师签名年月日毕业论文(设计)答辩评语及成绩成绩答辩委员会主席签名年月日毕业论文(设计)总成绩(五级记分制)院(系)负责人签名年月日 THESIS:ThedesignandrealizeCompanyattendancemanagementsystemSPECIALIZATION:SoftwareEngineeringBACHELOR:MaYinfengMENTOR:HuYuping 内容摘要公司考勤管理系统能够为客户提供考勤报到及信息查询和统计的工作,系统的功能与效率对于管理者來说都是至关重要的,是公司对人员管理的重要手段。木文先从实际出发,考察了部分公司的考勤管理系统,详细分析了系统目前存在的不足,并从公司考勤系统的现状和未來的发展趋势入手,使用Java与SQL等相关的技术,对这一系统进行编程开发,进而实现系统的各种功能。其中在通过具体的详细分析Z后,主要设计了用户管理模块、员工考勤模块、员工管理模块与考勤信息模块四个大的模块來对系统进行编码,并根据模块对数据库和界面进行设计。同吋,文章给出了各个关键模块的功能说明、实现代码,最后对系统进行了功能测试,并就开发过程中存在的问题进行了总结。关键词:Java模块数据库公司考勤管理系统设计及实现 AbstractTheattendancemanagementsystemcanprovideattendancereportandinformationqueryandstatisticsforthecustomer"sworkisessential,functionandefficiencyofthesystemformanagersofthecompany,isanimportantmeansofpersonnelmanagement.Thisarticlefirstembarksfromthereality,theattendancemanagementsystemispartofthecompany,adetailedanalysisoftheshortcomingsofthecurrentsystem,andfromthepresentsituationofthecompanyattendancesystemandthefuturedevelopmenttrend,theuseofJavaandSQLandotherrelatedtechnologies,programmingofthesystem,soastorealizethevariousfunctionsofthesystem.Thethroughdetailedanalysisofconcrete,themaindesignoftheusermanagementmodule,employeeattendancemodule,staffmanagementmoduleandtheattendanceinformationmodulefourbigmodulestocodesystem,andbasedonthedatabaseandinterfacedesignmodule・Atthesametime,thepapergivesthedescriptionofthefunctionofeachkeymodule,therealizationofthecode,finallyhascarriedonthesystemfunctiontest,andsummarizestheproblemsexistinginthedevelopmentprocess・Keywords:JavaModuleDatabaseTheCompantattendancemanagementsystem 1•引言12.公司考勤管理系统需求分析22」系统概述22.2系统运行环境22.2.1硕件环境22.2.2软件环境22.3开发工具22.3.1Java22.3.2Eclipse22.3.3SQLServer201232.4系统需求分析32.4.1系统数据流图32.4.2系统功能需求4243系统功能需求用例图53.公司考勤管理系统的总体设计63.1开发和设计的总体思想63.2系统模块结构设计63.3系统功能模块划分63.3.1用户管理模块63.3.2员工考勤模块73.3.3员工管理模块73.3.4考勤信息模块73.4系统流程描述73.5数据结构设计83.5.1数据库的E・R图设计8 3.5.2数据库表结构93.6界面设计103.6.1登录模块界面103.6.2系统主界面113.6.3员工考勤界面113.6.4员工管理界面123.6.5关于木系统界面123.6.6管理员界面133.6.7成员信息管理界面143.6.8通讯录界面173.6.9备忘录界面183.6.10音乐管理界面193.6.11退出对话框192.公司考勤管理系统详细设计204」连接数据库模块204.1.1模块描述204.1.2主要程序清单204.2登录模块214.2.1模块描述214.2.2主要程序清单214.3主界面模块234.3.1模块描述234.3.2主要程序清单234.4考勤模块334.4.1模块描述33 4.4.2主要程序清单334.5信息统计模块374.5.1模块描述37 4.5.2主要程序清单384.6管理员模块444.6・1模块描述444.6.2主要程序清单444.7音乐管理模块524.7.1模块描述524.7.2主要程序清单525.系统测试和应用545.1系统测试545.1.1关于软件测试545.1.2黑盒测试545.2系统应用556・结语与展望56参考文献57致谢58 1•引言随着社会的发展,人民生活水平的提高,人民对生活的质量要求越来越高,也就导致了房地产事业的快速发展。而城市化的进程使得传统的四合院家族越来越少,随之而来的是,各地的高楼大厦拔地而起。为了满足生活要求和精神需求,越来越多的人选择了离开家族,“自力更生”。从而导致的结果是,家族之间的交流沟通,以及家族成员之间的信息管理变得更加地困难。计算机软件和硬件等技术的高速发展,使得计算机在全世界的应用越来越广泛,遍及各个行业各个角落,人们普遍使用计算机来提高工作效率,计算机成为现代人不可缺少的一部分。在信息横飞的当今社会,我们应该懂得如何利用计算机来对这些信息加以管理,从而更有效地为管理部门提供现代化日常办公条件及丰富的综合信息服务,实现档案管理自动化和办公事务处理自动化,以提高办公效率和管理水平。在现代社会发展和计算机出现的双重影响下,用户对家族软件的需求也越来越高,家族信息管理系统的开发也就不可避免地成为当前软件开发的乂一热点。目前,我国的家族信息管理系统还处在萌芽阶段,询未普及,但是,它确确实实己经岀现在现代的一些家族和城中村,而且作为管理事业的一部分发挥着越来越重要的作用。家族信息管理系统能够为用户进行成员管理、基本信息管理以及统计查询等工作提供便捷的服务,有利于实现对家族事业的现代化管理,有利于协调配合城中村的各项工作,有利于促进家族成员的沟通与联系,对构建社会主义以人为本的和谐社会具有重要的现实意义,已是现代家族事业管理必不可少的一部分。本项目提岀的家族信息管理系统是基于VC平台,使用VC中基于MFC的Windows应用程序进行开发的,并且运用了ODBC数据访问技术。VisualC++不仅是一个C++编译器,而口是一个基于Windows操作系统的可视化集成开发环境。因此,基于VC平台的开发,可以使软件具有较好的可操作性,并口帮助实现界面的友好性等。由于家族信息管理系统涉及的功能和用途在不同的地方有所不同,因此,设计并实现具有基本功能并有效合理的家族信息管理系统是本项目开发过程中着重考虑的问题。另外,本项目除了实现家族信息管理系统的基本功能之外,还重点考虑了信息管理系统界面的易用性和友好性等问题。 2.家族信息管理系统需求分析2.1系统概述本项目主耍是设计并实现了公司考勤管理系统,该系统主要的功能包括系统员工管理、员工基本信息管理、员工考勤管理、统计查询,例如新增员工、查找员工、查找某员工信息、员工考勤信息统计情况等。2.2系统运行环境2.2.1硬件环境处理器:InterPentiumII266MX或更高内存:64MB硬件空间:2GB显卡:SVGA显示适配器222软件环境操作系统:WindowXP/7/8数据库:SQLServer20122.3开发工具2.3.1VisualC++6.0及C卄语言①VisualC++的简介VisualC++"是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用的很大的局限性,只适用于Windows2000,WindowsXP和WindowsNT4.0o所以实际中,更多的是以VisualC++6.0为平台。VisualC++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)。VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。VisualC++它大概可以分成三个主要的部分:DeveloperStudio,MFC,PlatformSDKoVisualC++包含了两套完整的Windows应用程序开发系统,既可以使用Win32API来开发用C编写的Windows应用程序,也可以开发基丁•MFC的Windows应用程序,此外,VisualC++也包括ActiveX模板库(ActiveXTemplateLibrary,ATL),可以用它来开发在Internet上使用的ActiveX控件,还可以制作基于MFC的ActiveX控件,还可以设计基于C或C++的动态链接库(DLL)oVisualC++具有面向对象程序设计的功能,VisualC++的核心是Microsoft基础类库(Microsoft FoundationClassLibiary,MFC),采用的是消息映射机制进彳亍程序设计。②C++语言的简介C++⑵是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtualfunction)^运算符重载(operatoroverloading)^多重继承(multipleinheritance)>模板(template)>异常(exception)>名字空间(namespace)等逐渐被加入C++标准。但是,C++是一门独立的语言,它并不依赖于C语言。2.3.2MicrosoftAccess2003MicrosoftAccess"是由微软发布的关联式数据库管理系统。它结合了MicrosoftJetDatabaseEngine和图形用户界面两项特点,是MicrosoftOffice的成员Z—。Access是微软公司推出的基于Windows的桌面关系数据库管理系统(RDBMS),是Office系列应用软件Z-o它提供了表、查询、窗体、报表、页、宏、模块7种用來建立数据库系统的对象;提供了多种向导、生成器、模板,把数据存储、数据查询、界面设计、报表生成等操作规范化;为建立功能完善的数据库管理系统提供了方便,也使得普通用户不必编写代码,就可以完成大部分数据管理的任务。2.4系统需求分析软件需求分析⑷是软件定义时期的最后一个阶段,它的基本任务是准确地回答“系统必须做什么”的问题,需求分析师发现、求精、建模和规约的过程。需求分析的方法冇结构化分析方法和英他分析方法。其屮,结构化分析方法是而向数据流进行需求分析的一种方法。它使用数据流图(DFD,DataFlowDiagram)>数据字典(DD,DataDictionary)等工具进行分析。2.4.1系统数据流图系统数据流图⑷是描述数据处理过程的工具,它具有抽彖性、概括性和层次性的三个特性。本系统的数据流图如图2.4.1所示。 图2.4.1系统数据流图242系统功能需求①新建家谱,打开已有家谱文件,对家谱成员进行排序,增加成员,查找成员,确定某两个成员Z间的关系,查找某代人的信息等功能,如图2.4.2所示。家族信息背理系统图2.4.2功能需求图②在使用该系统软件吋,能够供系统用户在电脑上任意选择自己喜欢的MP3文件进行播放。咅乐的选择能够增强该系统的艺术感,并且在用户使用软件时,利用咅乐可以达到放松心境的效果。③在使用该软件的过程屮,系统管理员可以设置其他的系统用户,如信息录入员、系统管理员等,不同的系统用户拥有不同的系统功能。④因为有了不同的系统用户,所以不同的用户可以通过通讯录了解其他用户的信息,并且通过电子邮件联系其他系统用户,又或者利用备忘录给其他系统用户留言。⑤木系统提供了清晰友好的界面,用户可以根据口己的需要和喜好进行选择,在选择的过程中,系统还会出现一些提示信息,引导用户止确进行操作。 2.4.3系统功能需求用例图用例图①显示系统中的用例与角色及其相互关系。用例是系统提供的高级功能块,角色是与所建系统交互的对象。用例图由参与者(Actor)、用例(UseCase)、系统边界、箭头组成。其中,用例Z间一般有三种关系:泛化关系,扩展关系,包含关系。本系统的功能需求用例图如图2.4.3所示。图2.4.3用例图 3・家族信息管理系统的总体设计3.1开发和设计的总体思想本系统采用VisualC++6.0为开发工具与Access作为后台数据库相结合实现,总体思想基于面对对象的程序设计。应用高级语言程序设计中的循环、选择等控制结构实现家族信息管理系统的增、删、改和查等经典功能,大量信息的存储和操作用Access数据库来实现。在软件开发过程中应用了软件工程以及二叉树⑹的基本理论。基于成本以及安全性考虑,假设本系统是一个相对封闭的单机运行系统,不提供与其他系统的实时数据交互。系统基本的流程是:用户登录一主界面一选择各项功能。3.2系统模块结构设计木家族信息管理系统主要分为4个了模块,其系统结构设计图如图3.2.1所示。家族信息管理系统修改帐户密码系统管理员增减用户用户密码修改通讯录管理音乐选择系统信息录入员系统用户统计杳询家族成员统计杳询图3.2.1系统结构图3.3系统功能模块划分根据上述系统总体设计思想的分析,该系统的主要模块的设计如下:3.3.1系统用户管理模块用户使用该系统Z前需要进行登录验证,系统会提示用户选择用户和输入密码,从而调用数据库中存储的该用户信息进行校验,如杲未能通过校验,则会提示用户密码错误,用户将有三次登陆到系统的机会,三次机会还没有登陆系统的话,系统将自动退出。用户登录到系统后允许使用的与权限相对应的系统功能,主耍有系统管理员、系统维护员、以及系统信息录入员。3.3.2基本信息管理模块包括对家族信息进行管理、对系统用户进行管理、咅乐选择等功能。其中,对系统用户管理的模块中,主要包括新增各类系统新用户,包括用户名称、用户权限、用 户密码、密码确认,同时还可以对系统用户进行注销以及密码修改等操作;而咅乐选择功能可以选择硬盘中的齐类格式的咅乐文件。3.3.3家族信息管理模块包括新建家谱,然后可以对家谱进行管理,包括姓名、父亲姓名、出生□期、家庭地址、健在否(包括死亡日期)、婚否等信息。在该家谱的基础上,可以进行删除记录、增加孩子、确定两人关系、更改资料等操作。该系统可以对多个家谱进行管理,并且分别进行保存文件。也可以对已经做好的家谱进行保存,并随时进行管理操作。3.3.4统计查询模块包括对系统用户的统计查询以及对家族成员的统计查询两大模块、其中对系统用户的统计杳询包括从姓名、生日、手机号码进行查找,同时可以查看系统用户的屈性,创建新的用户、给新用户发电了邮件等。而对家族成员的统计杳询模块中,主要包括对家族成员表进行统计查询,包括按出生□期排序、按姓名查找成员、按生口查找成员、杳询某一代的信息等操作。3.4系统流程描述运行系统后,首先看到登录窗体,对用户的身份进行认证。在本系统屮,应该首先增加家谱信息,之后才能对家谱成员进行操作。基本信息管理模块包括节基本信息设置模块包括对家族信息进行管理、对系统用户进行管理、音选择乐等功能。其小,对系统用户管理的模块屮,主要包括新增齐类系统新用户,包括用户名称、用户权限、用户密码、密码确认,同时述可以对系统用户进行注销以及密码修改等操作;而音乐选择功能可以选择硕盘屮的各类格式的音乐文件。添加家谱信息Z后,就可以对家族中的成员进行各类的操作了。家族信息管理设置模块包括新建家谱,然后可以对家谱进行管理,包括姓名、父亲姓名、出生日期、家庭地址、健在否(包括死广日期)、婚否等信息。在该家谱的基础上,可以进行删除记录、增加孩子、确定两人关系、更改资料等操作。该系统可以对多个家谱进行管理,并且分别进行保存文件。也可以对已经做好的家谱进行保存,并随时进行管理操作。统计查询模块包括对系统用户的统计查询以及对家族成员的统计查询两大模块、其小对系统用户的统计查询包括从姓名、生日、手机号码进行查找,同时可以查看系统用户的屈性,创建新的用户、给新用户发电子邮件等。而对家族成员的统计查询模块屮,主耍包括对家族成员表进行统计查询,包括按出生日期排序、按姓名查找成员、按生H查找成员、查询某一代的信息等操作。本系统流程分析如图3.4.1所示。 结束图3.4.1系统流程图3.5数据结构设计3.5.1数据库的E・R图设计家族信息管理系统采用Access2003数据库存储通讯录用户的有关信息,而对于系统用户是通过自动程序自动保存设置,家族成员是通过文件进行保存。其E-R图⑺如T: 图3.5.1系统E-R图352数据库表结构①系统用户数据表,如表1所示。其中,系统用户信息表的各数据项详细说明如表2所示。表1用户登陆密码amy[信息录入员]0000000SystcmC系统管理员]0000000表2数据字段数据类型user文本password文本②在数据库中,系统通讯录用户信息存在BookData表中,其基木信息如表3所示。其中,系统用户信息表的各数据项详细说明如表4所示。 表3nameemciilqqmobilephonebirthdayworkunithomepagedemo杨丽金ylijin22@126.com48377708136314647630208409477919861031广东商学院李涛litao@163.com131457275300763231256919850512表4数据字段数据类型name文本emai1文本qq文本mobile文本phone文本birthday文本workunit文本homepage文本demo文木3.6界面设计家族信息管理系统要为用户提供一个易于操作的人机界面,在界面设计过程中充分考虑界面的一致性和简洁性、要求方便易用,界面友好,具休设计如下。3.6.1登录界面①用户登录界面设计充分考虑到用户实际应用系统时可能出现误操作的情况,如果用户输入的用户名和密码不符,则提示用户重新输入。②为保证用户输入密码不会被窃取,用户进入系统时输入的密码采用不回显的方式从屏幕获取用户输入的字符,从而保证顾客登录系统时密码的安全性。③当用户输入的用户名与密码相符,则会直接进入系统主界面。④根据不同的权限,调用相应的系统界面。 请先登录•••请选择用户:System係统邕二请输入密码:图3.6.1登录界面3.6.2系统主界面系统管理员默认名为System,密码为0000000;信息录入用户名为amy,0000000为密码,确认登录后进入主界面,如图3.6.2所示。图3.6.2系统主界面3.6.3系统用户管理界面用户登录到系统后允许使用的与权限相对应的系统功能,主要有系统管理员以及系统信息录入员。系统用户管理的模块中,主要包括新增各类系统新用户,包括用户名称、用户权限、用户密码、密码确认,同时还可以对系统用户进行注销以及密码修改等操作。密码修改成功后,系统将会提示“密码修改成功,请牢记新密码”。用户管理界面如图3.6.3所示。 图3.6.3用户管理界面3.6.4帮助界面帮助皿家族信息管理系统嗾*版权所有(C)2009帳用二叉树进行家谱的管理.树形控件及列表控件进行家谱的显不I.二"用户手册1.本程序的运行环境为Windows95/98/ME以及Windows2000/NT/XP操作系统》执行件为Familytree.exeo本程序的編译环境为MicrosoftVisualC++6.0>在WindowsXF下編i半通过a3.进入演示程序后即显示窗口方式的用户界面,然后输入密码,进入主界面。农接受命令后既执行相应运算和显示相应结果。确定图3.6.4帮助界而3.6.5关于本系统界面该界面采用Flash动画形式对系统进行介绍,并且可直接点击E-mail直接开启Ooutlook联系作者。如图3.6.5所示。 图3.6.5关于本系统界而3.6.6家族信息管理界面家族信息管理设置模块包括新建家谱,然后可以对家谱进行管理,包括姓名、父亲姓名、出生日期、家庭地址、健在否(包括死亡日期)、婚否等信息。在该家谱的基础上,可以进行删除记录、增加孩子、确定两人关系、更改资料等操作。该系统可以对多个家谱进行管理,并且分别进行保存文件。也可以对已经做好的家谱进行保存(必须输入后缀,否则文件不能打开),并随时进行管理操作。界而如图3.6.6所示。缺寡族信息管理系统区|文件CFile)控制Control)系统(System)帮助Qfelp)文件打开家诸少建凉谱色保存家谱另存家谱通讯信息系筑管理系统管理畅石玉杨杨畅畅杨畅I姓名[岀生日健在否二^杨石玉1921—3—15删除该人,増加孩子生日期排序某代信息照姓名查找照生日查找定两人关系海更改资料苴它操作音乐选择退出图3.6.6家族信息管理界面 添加信息-添力[|信J息姓名:|i父亲姓名:|杨石玉(-1表示根节点)岀生日期:|0年|0月|0日厂婚否地址:17健在否死亡日期:[0年戶取消图3.6.7增加孩子3.6.7成员信息管理界面在家族信息管理模块下,可以进行删除记录、增加孩子、确定两人关系、更改资料、按生日进行排序等操作。成员信息管理界面如图3.6.8所示。麻寥族信息管理系统I出生日期1921—3—151949—5—91955—9—201960—10—261963—8—151966—5—11968—12—51975—6—241979—12—251980—7—191981—2—91982—6—291984—1—231986—10—311987—11—7姓名<文件(Jile)控制Control)系统(System)帮助Qlelp)文件系统管理否§*P疋是是星是是是是是是是是否否否木巾市市市市TS德語番痔杨招娣杨文深杨永胜杨永平杨书娣畅永源房大妹房细妹杨师筹房館路杨丽花杨师海场丽金杨师可英語市下代镇山市市区盘猪亍亍大・・•央篤f亍大・・・英德市大馆链广卅市花都区广州市海诛区厂州市番禺区苴它操作音乐选择魏退出图3.6.8点击“出生期排序”后系统界面 查询一代人信息Fa>ilytree宴查询第代的fl息确定取消图3.6.9可填入任一代人的信息h家族信息管理系统文件®ile)控制(Control)系统Gystm)帮助Qlelp)厂文件約打开家谙!该代所吉成员的僧息谓见下部列哀"图3.6.10系统提示IZI系统管理新建家谙保存家谙另存家谙通讯信息系统管理娣深胜平娣源姓名出生日期婚否地址健在否I宦丰华2004—11—9r—+4・°rTia1<1^■1」丿•••2005—6—6否央為市大・・・华文亿2006—2—22否央彳悪市大萌萌删除该人恿増加孩子生日期排序某代信息其它操作电a音乐选择照姓名查栈照生日查栈定两人关系爲更改资料退出图3.6.11右边表格出现该代人的信息图3.6.12输入要查询的名字“杨蕾”图3.6.13系统提示 兔家族信息管理系统文件(Zile)控制Control)系统(System)帮助Qfelp)文件系统管理打开家谱◎新建家谱保存家诸另存家谙通讯信息系统管理-杨石玉娣深胜平娣源招文永永书永杨杨杨杨杨杨I姓名出生日期婚否地址健在否I杨苗杨蕾的父亲:1丄7亠1995—12—5$2ji-rhniX畅永源1968—12—5是韶关帀帀区是控制C7>删除该人増加孩子希生日期排序縊某代信息其它操作迤、音乐选择照姓名查找电按照生日查找定两人关系猱更改资料退出按照生日查找图3.6.14右边表格出现“杨蕾”的相关信息请输入查询的生日:[10月丽日Q确定副取消图3.6.15输入查询的生日“10.31”图3.6.16系统提示 兔家族信息管理系统文件(Zile)控制Control)系统(System)帮助Qfelp)文件打开家谱◎新建家谱通讯信息系统管理娣深胜平娣源I姓名岀生日期婚否地址健在否生日期排序匸、某代信息其它操作迤、音乐选择另存家谙系统管理控制C7>删除该人"毬増加孩子照姓名查找电按照生日查找定两人关系猱更改资料退出图3.6.17出现生日为“10.31”的成员的信息两人关系比较请输入两人姓名:第一人姓名:第二人姓名:杨招娣|华文亿确定砂取消图3・6・18输入“杨招娣”及“华文亿”两人的名字Fanilytree■杨招娣在家谙中的位置:杨招娣杨石玉!华文亿在家诸中的位置:华文亿->杨丽花->杨文深->杨石玉杨招娣在第2代,华文亿在第4代"杨招娣是华文亿的长辈.『二霸定二制图3.6.19系统提示并显示两人之间的关系3.6.8通讯录界面在通讯录屮,我们可以进行增加、修改、删除用户资料,查看用户屈性,查找用户,通过电子邮件联系用户等操作。界面自动调用数据库中BookData表信息。查找用户的查找项有:姓名、手机号码、电话号码、QQ、生日、工作单位、个人主页、EMAIL、备注等。而删除用户时,应点击通讯录中某人的信息,再点击“删除”町删除该系统 用户的资料,系统会口动提示“是否真的要删除”。具体界面如图3.6.20所示。通讯录区I越创建卡片絃写邮件偏属性(M删除⑨查找I姓名MAIL|QQI手机号码丨电话号码1^^^番忘录图3.6.20通讯录界血3.6.9备忘录界面在通讯录界面中,用户可以通过备忘录进行留言。备忘录文件存储在文件夹中,以".dat”为后缀,可以随时调出备忘录文件进行查看,修改等,同时也可新建新备忘录,新建时,可以指定当天的口期、天气等信息,以便以后杳看和确认。界面如图3.6.21所示。图3.6.21备忘录界面 3.6.10音乐管理界面用户可以在使用该软件的时候,播放电脑中的任意mp3播放文件,在工作的同时享受音斥的熏陶。播放过的文件,其路径会保留,以便下次直接播放。该界面如图3.6.22所示。图3.6.22音乐界而3.6.11退出对话框退出时,正在进行的音乐会同时退岀,并但会显示一下界而,如图3.6.23图3.6.23退出界面显示 4.家族信息管理系统详细设计4.1连接数据库模块4.1.1模块描述本系统采用ODBC技术访问数据库,在类的类型中生成Familytree.cpp,默认文件为Familytree.cpp.4.1.2主要程序清单BOOLCFamilytreeApp::InitODBC(){charstrCurfile[256J;char*p;CFileFindfile;::GetModuleFileName(m_hInstance.strCurfile,sizeof(strCurfile));p=strCurfile;while(strchr(p/\")){p=strchr(p^V);P++;}*p="";strcat(strCurfile,MBookData.mdbM;if(!file.FindFile(strCurfile)){AfxMessageBox("找不到BookData.mdb数据库文件,请保证该文件和本程序在同一个目录中!H,MB_OK|MB_ICONSTOP);returnFALSE;)if(GetProfileInt(H数据源”,”IsFirstRun”,O)){CStringstrKeyDir=GetProfileStringC*数据源,,;,CurDirn);if(strKeyDir.Compare(strCurfile)){WriteProfileString("数据源^/"CurDir"^strCurfile);retum(LoadODBC(CString(,"CarsDataBaseM),CString(strCurfile),CString(,"数据源")));)) else{USERINFOsysuser;strcpy(sysuser.name/"SystemM);sysuser.oper=1;strcpy(sysuscr.password,"system");AfxGetApp()->WriteProfileBinary(n用户”,“UserOOOO“,(LPBYTE)&sysuser,sizeof(sysuser));AfxGetApp()->WriteProfileInt(n用八”,“LastID“,l);WriteProfileInt(,r数据源”,”IsFirstRun”,l);WriteProfileString(H数据源"/CurDir^strCurfile);remm(LoadODBC(CStringCCarsDataBase”),CString(strCiirfilc),CStringC数据源“)));}returnTRUE;}4.2登录模块4.2.1模块描述身份认证分为以下两个过程:首先确认用户是否冇效的系统用户,其次确认用户的类型。第一个过程决定用户能否进入系统,第2个过程根据用户的类型决定用户的操作权限。如果述要创建其他用户,则使用System:系统管理员]用户登录,可以在用户管理模块屮创建和管理;否则建议使用信息录入员身份登录,此时不能创建新用户,只能进行其他功能操作。在创建系统用户时,需耍输入耍创建的用户名、用户权限、密码以及密码确认。System:系统管理员]用户述可以添加和注销其他用户数据。登录对话框为IDD.LOGIN,为其创建一个类CLoginDlgo当用户单击确定按钮时,将发送BN_CLICKED消息,在ClassWizard窗口屮为其添加函数CLoginDlg::OnOk()o4.2.2主要程序清单BOOLCLoginDlg::OnInitDialog(){CDialog::OnInitDialog();USERINFOtheUser;char*strOper[]={{”信息录入员“},{“系统管理员”}};UINTsize=sizeof(USERINFO);LPBYTEbt=newunsignedchar[sizcof(thcUscr)];CStringstrlD;strID.Format("User%04u",0);intlastID;lastID=AfxGctApp()->GctProfiIcInt(H用户“,“LastID”,0);for(inti=O;iGetProfileBinary("用户",strID,&bt,&size);i++){memepy(&theUser5bt,sizeof(theUser));CStringstrlnfo; strInfo.Format(M%s[%s],theUser.name,strOper[theUser.operJ);m_uList.AddString(strInfo);strlD.Format(HUser%04uM4+1);}if(lastID>0)m_uList.SetCurSel(O);delete[Jbt;m_btnButton2.SubclassDlgItem(IDOK,this);m_btnButton2.SetIcon(IDI_ICON2);m_btnButton3.SubclassDlgItem(IDCANCEL,this);m_btnButton3.SetIcon(IDI_ICON3);returnTRUE;)voidCLoginDIg::OnOK(){UpdateData();USERINFOtheUser;UINTsize=sizeof(theUser);LPBYTEbt=newunsignedcharfsizeof(theUser)];CStringstrlD;intid=m_uList.GetCurSel();strID.Format("User%04u",id);if(AfxGetApp()->GetProfileBinary(n用户”,strlD,&bt,&size)){memcpy(&theUser,bt,sizeof((heUser));delete[]bt;if(!m_pas.Compare(theUser.passwoixi)){m_dwUser=theUse匚oper;CDialog::OnOK();return;}}else{delete[Jbt;MessageBoxC*没有该用户的信息,请与系统管理员联系。读取用户数据错谋”,MB_OK|MB_ICONSTOP);return;}if(m_times){m_times—;MessageBox(n用户密码不正确!请再次尝试!”,”登陆失败!”,MB_OK|MB」CONSTOP);GetDlgItem(IDC_DLOG_CPASWORD)->SetFocus();}else{McssagcBox(“用户密码不正确!n您的登陆失败次数已达三次,程序将退Hien请与系统管理员联系。”,”登陆失败!,r,MB_OK|MBJCONSTOP); CDialog::OnCancel();4.3主界面模块4.3.1模块描述用户成功登录后进入系统主界面,根据不同权限完成和应的功能操作。主界面的类为FamilytreeDlg.cpp04.3.2主要程序清单①OnDelete()函数OnDeleteO®数功能是将家谱屮的某成员进行删除操作,代码如下:voidCFamilytreeDlg::OnDelete(){//TODO:Addyourcommandhandlercodehereif(operFamilytree.GetRoot()==0)return;HTREEITEMhItem,hChildItem;hItem=m__peTree.GetSelectedItem();hChildItem=m_peTree.GetNextItem(hItem,TVGN_CHILD);charname[MAX_CHARNUM];strcpy(name,m_peTree.GetItemText(hItem));intanswer;if(hChildItem==O)answer=::MessageBox(this->m_hWnd,"你确实想删除"+CString(name)+"吗?",”警告”,MB_YESNO|MB_ICONWARNING);elseanswer=::MessageBox(this->m_hWnd,CString(name)+n还有孩子,如果你删除了他,其孩子也一并被删除。你确实想删除此人及其孩子吗?”,”警告“,MB_YESNO|MB」CONWARNING);if(answer==IDNO)return;Persononeself=0;operFamilytree.Find(operFamilytree.GetRoot(),oneself,name);if(oneself)operFamilytree.Delete(oneself);m_peTree.DeleteItem(hItem);RefreshTree();RefreshList(); IsFamilytreeModified=true;〃置家谱修改标记为真②OnAdd()函数当对话框IDC_ADD启动时触发CFamilytreeDlg::OnAdd()^|数。增加孩了,需要检杳家谱中是否有重名的孩子,并口要对其出生口期以及死亡□期(如果有的话)。对应的代码如下:voidCFamilytreeDlg::OnAdd(){//TODO:AddyourcommandhandlercodehereCAddlnfoDlgdig;HTREEITEMhltem;hItem=m_peTree.GetSelectedItem();if(operFamilytree.GetRoot()==0)dlg.m_parentname=H-rr;elsedlg.m_pai-entname=m_peTree.GetItemText(hItem);if(dlg.DoModal()==IDCANCEL)〃弹出对话框return;UpdateData(FALSE);Personaddnode;addnode=newPersonNode;〃新屮请一结点if(addnode==0){AfxMessageBox(H内存不足!");return;}addnode->parent=0;addnode->child=0;addnode->sibling=0;〃把有关结点信息加入到结点屮去strcpy(addnode->info.name,dig.m_name);strcpy(addnode->info.addr,dlg.m_addr);addnode->info.birthday.year=dlg.m_birthday_year;addnode->info.birthday.month=dlg.m_birthday_month;addnode->info.birthday.day=dlg.m_birthday_day;addnode->info.marry=dlg.m_marry;addnode->info.live=dlg.mJive; 〃若此人己过世,则还应有死亡Fl期if(!dlg.m_live){addnodc->info.dcathday.ycar=dlg.m_dcathday_ycar;addnode->info.deathday.month=dlg.m_deathday_iTionth;addnode->info.deathday.day=dlg.m_deathday_day;}Persononeself=();operFamilytree.Find(operFaiTiilytree.GetRoot(),oneself,addnode->info.name);〃杳找家谱中有没有此人if(oneself!=()){AfxMessageBox("r家谱中已有此人!”);deleteaddnode;return;}Personparent=0;charparentname[MAX_CHARNUM];strcpy(parentname,dlg.m_parentname);if(strcmp(parcntnamc,",-lM)==0){〃试图加入一个新的根结点时给出警告intreply;reply=::MessageBox(this->m_hWnd,"fift实要置此结点为根结点吗?",”警告n,MB_YESNO|MBJCONWARNING);if(reply==IDNO)return;}else{〃加入的结点不是根结点operFamilytree.Find(operFamilytree.GetRoot(),parent,parentname);〃在家谱屮找addnode的父结点if(parent==()){AfxMessageBox("父亲结点没找到!”);deleteaddnode;return;}}//II期合法性检杏if(!operFamilytree.IsDateValid(addnode->infb.birthday)){ AfxMessageBoxC1个人信息屮的出生日期不合实际!deleteaddnodc;return;}//比较孩子结点与其父亲结点的出生Fl期if(strcmp(parentname,,,-r,)!=0){〃加入的结点不是根结点if(operFamilytree.CompareDate(addnode->infd.birthday,parent->infb.birthday)<0){AfxMcssagcBox(”所加入孩了的出生口期比其父亲的出生口期早,不合实际!”);deleteaddnode;return;}elseif(operFamilytree.CompareDate(addnode->info.birthday,parent->info.birthday)==()){AfxMessagcBox(“所加入孩子的出纶日期与其父亲的出纶Fl期相等,不合实际!“);deleteaddnode;return;)}if(!addnode->info.live){〃杳看死亡日期的合法性if(!operFamilytree.IsDateValid(addnode->info.deathday)){AfxMessageBoxC^人信息中的死亡Fl期不合实际!“);deleteaddnode;return;}if(operFamilytree.CompareDate(addnode->info.birthday,addnode->info.deathday)>()){AfxMessageBoxC*此人出生日期不可能比其死亡日期早!“);deleteaddnodc;return;}}〃找到,把addnode加入家谱中〃得到树的根结点〃加入的结点不是根结点operFamilytree.Add(parent,addnode);HTREEITEMhParentItem=0,hRootItem;hRootItcm=m_pcTrcc.GctRootItcm();if(strcmp(parentname,n-rf)!=O) FindInTree(hRootItem,hParentItem,parentname);//在树屮找到要加入结点addnode的父结点 parentname〃把此结点加入到树中〃刷新该树〃宙家谱修改标记为真AddToTrcc(hParcntItcm,addnodc);RefreshTree();IsFamilytreeModified=true;③OnFamilylweSoH()函数OnAddButtonO函数,当用户单击“出生日期排序”按钮时触发CFamilytreeDlg::OnFamilytreeSort()函数,对应的代码如下:voidCFamilytreeDlg::OnFamilytreeSort(){//TODO:AddyourcommandhandlercodehereRefreshList();QuickSortNode*order;inttotalNums=();operFamilytree.GetPersonNums(operFamilytree.GetRoot(),totalNums);order=newQuickSortNode[totalNums+1];if(!order))AfxMessageBox(M内存不足!");return;}operFamilytree.SortByBirthday(order);for(inti=l;iparcnt){Displays”); Display(CString(name)+"的父亲:”);DisplayInListCtrl(oneself->parent);)if(oneself->child){Display(””);Display(CString(name)+n的长子:”);DisplayInListCtrl(oneself->child);©OnBirthday()函数当用户单击“按生口查找”按钮时触发OnBirthdayO函数,对应的代码如下:voidCFamilytreeDlg::OnBirthday(){//TODO:AddyourcontrolnotificationhandlercodehereCBirthdayDlgdig;if(dlg.DoModal()==IDCANCEL)return;intcurmonth,curday;curday=dlg.m_birthday_day;curmonth=dlg.m_birthday_month;Persononeself[30J;for(inti=0;iv30;i++)oneselffi]=0;Person*start=oneself;operFamilytree.Find(operFamilytree.GetRoot(),start,curmonth.curday);if(oneselfT()]!=()){CStringallnames(u该天为以F家族成员的生日:”);for(i=0;oneself[i]!=0;i++){allnames+=MH;allnames+=oneselfli]->info.name;allnames+=Mallnames+="n详细信息请见以下列表::MessageBox(this->m_hWnd,allnames,n杏找结果:“,MB_OK|MB_ICONINFORMATION);RefreshList(); for(i=0;oneself[i]!=0;i++)DisplaylnListCtrl(oneselfTil);}else{AfxMessageBox(”没有找到生日为该天的家族成员!”);RefreshList();}}©OnFamilytreeRelations()函数当用户单击"确定两人关系”按钮时触发OnFamily(rccRela(ions()函数,对应的代码如卜:voidCFamilytreeDlg::OnFamilytreeRelations(){//TODO:AddyourcommandhandlercodehereCRelationsDlgdig;if(dlg.DoModal()==IDCANCEL)return;UpdateData(FALSE);intposl,pos2;Persononeself=0;charname1[MAX_CHARNUM],name2[MAX_CHARNUM];strcpy(name1,dlg.m_firstname);operFamilytree.Find(operFamilytree.GetRoot(),oneself,name1);if(oneself)pos1=operFamilytree.InGenerationPos(oneself);else{AfxMessageBox(H本家谱中找不到,,+CString(name1)+"!");return;}Personp,q;CStringgeneration;generation+=oneself->info.name;generation+=”在家谱中的位置:n;for(q=oncsclf,p=q・>parcnt;p!=O;p=p->parcnt){generation+=q->info.name;generation+=n->M; q=p;)generation+=q->info.name;gcncration+=Hnu;oneself=();strcpy(name2,dlg.m_secondname);operFamilytree.Find(operFamilytree.GetRoot(),oneself,name2);if(oneself)pos2=operFamilytree.InGenerationPos(oneself);else}AfxMessageBox("本家谱中找不至!J"+CString(name2)+"!");return;}generation+=oneself->info.name;generation+=n4zE家谱中的位置:”;for(q=oneself,p=q・>parent;p!=O;p=p->parent){generation+=q->info.name;generation+=n->”;q=p;)generation+=q->info.name;gcncration+=Hnnn;CStringcmpResult;if(posl>pos2)cmpResult.Format("%s在笫%(]代,%s在第%d代,%s是%$的晚辈.",namel,posl,name2,pos2,name1,name2);elseif(poslinfo.name,dlg.m_newname);〃判断家谱屮是否己有丿IJ户给定的新名字if(strcmp(newValue->info.name,oldname)==0)〃用户不修改姓名else{Personp=();operFamilytree.Find(operFamilytree.GetRoot(),p,newValue->info.name);〃杳找家谱屮有没有此人if(p!=O){AfxMessageBox("家谱中已有此人!”);deletenewValue;return;}strcpy(newValue->info.addndlg.m_newaddr);newValue->info.marry=dlg.m_marry;newValue->info」ive=dlg.m_live;newValue->infd.birthday.day=dlg.m_birthday_day;newValue->info.birthday.month=dlg.m_birthday_month;newValue->info.birthday.year=dlg.m_birthday_year;if(!newValue->info.live){//如若过世,则应有死亡H期 newValue->info.deathday.day=dlg.m_deathday_day;newValue->info.deathday.month=dlg.m_deathday_month;ncwValuc->info.dcathday.ycar=dlg.m_dcathday_ycar;if(!operFamilytree.IsDateValid(newValue->info.deathday)){AfxMessageBox(n此人信息中死亡Fl期不合实际!”);deletenewValue;return;}if(operFamilytree.CompareDate(newValue->info.deathday,newValue->info.birthday)==-1){AfxMessageBoxC1此人死亡日期不可能比其出生日期早!“);return;)}operFamilytree.Modify(oneself,newValue);RefreshTree();RefreshList();IsFamilytreeModified=true;〃置家谱修改标记为真deletenewValue;}4.4系统用户管理模块4.4.1模块描述用户管理模块用来添加和注销用户信息,并可进行密码修改操作。用户管理对话框名称为1DD_USERDLG,对话框对应的类为CUserDlgo4.4.2主要程序清单①0nUdBadd()函数当用户单击“添加用户”按钮时触发OnUdBadd()函数,对应的代码如下:voidCUserDlg::OnUdBadd(){UpdateData();char*strq[]={「信息录入员”},{”系统管理员“}};intpurview=m_udcpv.GctCurScl();if(m_udename.IsEmpty()){MessageBox(n请指定用户名称。丁输入错误n,MB_OK);//|MB_ICONQUESION); GetDlgItem(IDC_UD_ENAME)->SetFocus();return;}if(purview==-1){MessageBox(n请指定用八权限。T输入错误n,MB_OK);//|MBJCONQUESION);GetDlgItem(IDC_UD_CPURVIEW)->SetFocus();return;}if(m_udepwd.Compare(m_udepwdr)){MessageBox(n两次输入的密码不一致,请重新输入!",”密码验证错H,MB_OK);//|MB_ICONQUESTION);m_udcpwd.Empty();m_udepwd匚Empty();UpdateData(FALSE);GetDlgItem(IDC_UD_ENP)->SetFocus();return;}intLastID=AfxGetApp()->GetProfileInt(H用户”,”LastID”,0);CStringstrlD;strID.Format("User%04un,LastID);USERINFOuser;ZeroMemory(&user,sizeof(user));strcpy(user.name,m_udename);use匚oper=purview;strcpy(use匚password、m_udcpwd);if(AfxGetApp()->WriteProfileBinary("用丿”",strID,(LPBYTE)&user,sizeof(user))){CStringstr=m_udcnamc+n[n+strq[purvicw]+"T;m_udlist.AddString(str);LastID++;AfxGetApp()->WriteProfileInt(n用户TLastID;LastID);}else{MessageBox(H数据写入出错!”,”错误H,MB_OK|MB_1CONSTOP);return; )m_udcpv.SetCurSel(O);m_udcnamc.Empty();m_udepwd.Empty();m_udepwdr.EiTipty();UpdateData(FALSE);)①OnUdBdel()函数当用户单击“注销用户”按钮时触发OnUdBdeK)函数,对应的代码如下:voidCUserDlg::OnUdBdel(){ints;CStringstrValue;s=m_udlist.GetCurSel();if(s<0){MessageBox(u请从右下角的列表中选择一个要删除用户。”,“指定用户错误”,MB_OK|MB_ICONSTOP);return;}if(s==O){AfxMessageBoxC^保证至少保留一个系统管理员,此用户不允许被删除,但您可以修改其密码。”,MB_OK|MB」CONSTOP);return;1m_udlist.GetText(s,strValue);strVahie二”确认删除此用户(u+strValue+M)吗?“;if(McssageBox(stiValuc,”确认删除用户M,MB_OKCANCEL|MB_ICONQUESTION)!=IDOK)return;intnLastID=AfxGetApp()->GetProfileInt(M用户,,;,LastID,,,0);if(!nLastID)return;HKEYkey;if(nLastID!=(s+l)){strValue.Format("User%04un,nLastID-l); USERINFOuser;UINTbtsize=sizeof(user);LPBYTEbt=newunsignedchar[bt$izc];AfxGetApp()->GetProfileBinary(,r用户",strValue,&bt,&btsize);memcpy(&user,bt,btsize);delete[]bt;strValue.Format(",User%04u",,s);AfxGetApp()->WriteProfileBinary("J=HX1",strValue,(LPBYTE)&user,btsize);}nLastID-;AfxGetApp()->WriteProfileInt(u用户M,nLastIDu,nLastID);strValue.Format(",User%04u",nLastID);::RegOpenKeyCHKEY.USERS/.DefaultWSoftWareWHMN-SOFTW车友\用户”,&key);::RegDeleteValue(key,strValue);::RegCloseKey(key);m_udlist.DeleteString(s);}①OnUdBmodify()函数当用户单击“修改密码”按钮时触发OnUdBmodifyO函数,对应的代码如H:voidCUserDlg::OnUdBmodify(){UpdateData(TRUE);ints=m_udlist.GetCurSel();if(s<0){MessageBox(n请从右下角的列表屮选择一个用户。",”指定用户错课n,MB_OK|MB_ICONSTOP);return;CStringstr;str.Format(HUser%04iT,s);USERINFOuser;UINTbtsize=sizeof(user);LPBYTEbt=newunsignedchar[btsize];AfxGetApp()->GetProfileBinary("用丿"1”,str,&bt,&btsize);memcpy(&user,bt,btsize); delete[]bt;if(m_udcnp.Comparc(uscr.password)){AfxMessageBox(H该用户的原密码不正确,请重新输入!”,MB_OK|MB_ICONSTOP);SetDlgItemText(IDC_UD_EOP,,H,);GetDlgItem(IDC_UD_EOP)->SetFocus();return;}if(m_udeonp.Compare(m_udenpr)){AfxMessageBox(H两次输入的密码不一致,请重新输入!”,MB_OK|MB_ICONSTOP);SetDlgItemText(IDC_UD_EONP;H,);SctDlgItcmTcxt(IDC_UD_EONPR,,M,);GetDlgItem(IDC_UD_EONP)->SetFocus();return;}strcpy(use匚password,m_udeonp);AfxGetApp()->WriteProfileBinary(n用八”,sir,(LPBYTE)&user,btsize);AfxMessageBox(n密码修改成功!请牢记!",MB_OK);SetDlgItemText(IDC_UD_EOP,,,n);SetDlgItemText(IDC_UD_EONP;,n);SctDlgItcmTcxt(IDC_UD_EONPR;n,);}4.5通讯录模块4.5.1模块描述通讯录模块用来用来记录系统用户及其他用户的基本信息,包括姓名、EMAIL.QQ、手机号码、电话号码、生日、工作单位、个人主页、备注等信息,并且可对通讯录进行添加、删除、查找、查看屈性、写邮件等操作。通讯录管理对话框名称为IDDDIALOGBOOK,对话框对应的类为CBookDialogo4.5.2主要程序清单©OnButtonMember()函数当用户单击“创建卡片”按钮时触发OnButtonMemberO函数,对应的代码如下:voidCBookDialog::OnButtonMember(){CCreateCardDialogdig;//dlg.DoModal(); if(dlg.DoModal()==IDOK){m_dataRecset->AddNew();m_dataRecset->m_name=dlg.m_name;m_dataRecset->m_email=dlg.m_email;m_dataRecset->m_qq=dlg.m_qq;m_dataRecset->m_mobile二dlg.m_mobile;m_dataRecset->m-phone=dlg.m_phone;m_dataRecset->m-birthday=dlg.m_birthday;m_dataRecset->m_workunit=dlg.m_unit;m_dataRecset->m-homepage=dlg.m_homepage;m_dataRecset->m_demo=dlg.m_demo;m_dataRecset->Update();intnListlndex=m_list.GetItemCount();m_list.InsertItem(nListIndex,LPSTR_TEXTCALLBACK);m」ist.SetItemText(nListIndex,O,dlg.m_name);m_list.SetItemText(nListIndex,15dlg.m_email);m_list.SetItemText(nListIndex,2,dlg.m_qq);m_list.SetItemText(nListIndex,3,dlg.m_mobile);m_list.SetItemText(nListIndex,4,dlg.m_phone);m_list.SetItemText(nListIndex,5,dlg.m_birthday);m」ist.SetItemText(nListIndex,6,dlg.m_unit);m_list.SetItemText(nListIndex,75dlg.m_homepage);m_list.SetItemText(nListIndex,&dlg.m_demo);}}②OnButtonEmailO函数当用户单击“写邮件”按钮时触发OnButtonEmailO函数,对应的代码如F:voidCBookDialog::OnButtonEmail(){CFamilytrccApp*pApp=(CFamilytrccApp*)AfxGctApp();intnltem;POSITIONpos=m_list.GetFirstSelectedItemPosition();if(pos!=NULL){nltem=m_list.GetNextSelectedItem(pos);m_dataRecset->MoveFirst();m_dataRccsct->Movc(nltem,SQL_FETCH_RELATIVE);pApp->m_szToEmail.Empty();pApp->m_szToEmail=m_dataRecset->m_email; }CSendMaildig;dlg.DoModal();}③OnBuHonPropcrfy()函数当用户单击“属性”按钮时触发OnButtonPropertyOl^l数,对应的代码如卜:voidCBookDialog::OnButtonProperty(){intnltem;POSITIONpos=m_list.GetFirstSelectedItemPosition();if(pos==NULL){MessageBox(“请先选择记录!;"提示“,MB_OK);return;elsenltem=m_list.GetNextSelectedItem(pos);m_dataRecset->MoveFirst();m_dataRecset->Move(nltem,SQL_FETCH_RELATIVE);CFamilytreeApp*pApp=(CFamilytreeApp*)AfxGetApp();pApp->m_bookData.szNamepApp->m_bookData.szEmailpApp->m_bookData.szqqpApp->m_bookData.szMobilepApp->m_bookData.szPhone=m_dataRecset->m_name;=m_dataRecset->m_email;=m_dataRecset->m_qq;=m_dataRecset->m_mobile;=m_dataRecset->m_phone pApp->m_bookData.szBirthday=m_dataRecset->m_birthday;pApp->m_bookData.szWorkUnit=m_dataRccsct->m_workunit;=m_dataRecset->m_demo;pApp->m_bookData.szHomepage=m_dataRecset->m_homepage;=dlg.m_namc;=dlg.m_email;=dlg.m_qq;=dlg.m_mobile;=dlg.m_phone;pApp->m_bookData.szDemoCPropertyDlgdig;if(dlg.DoModal()==IDOK){m_dataRecset->Edit();m_dataRccsct->m_namcm_dataRecset->m_emailm_dataRecset->m_qqm_dataRecset->m_mobilem_dataRecset->m_phonem_dataRecset->m_birthday=dlg.m_birthday;m_dataRecset->m_workunit=dlg.m_unit;m_dataRecset->m_homepage=dlg.m_homepage;m_dataRecset->m_demo=dlg.m_demo;m_dataRccsct->Updatc()m_list.SetItemText(nItemJ),dlg.m_name);m」ist.SetItemText(nItem?1,dlg.m_eiTiail);m」ist.SetItemText(nItem?2,dlg.m_qq);m_list.SetItemText(nItem53,dlg.m_mobile);m_list.SetItemText(nItem,4,dlg.m_phone);m_list.SetItemText(nItem,5,dlg.m_birthday);m_list.SetItemText(nItem,6,dlg.iTi_unit);m_list.SetItemText(nItem,7,dlg.m_homepage);m_list.SetItemText(nItem,8,dlg.m_demo); ①OnButtonDelete()函数当用户单击“删除”按钮时触发OnButtonDeleteOl^数,对应的代码如下:voidCBookDialog::OnButtonDelete(){intnltem;POSITIONpos=m_list.GetFirstSelectedItemPosition();if(pos==NULL){MessageBox(n请先选择所要删除的记录!”,”提示“,MB_OK);return;}else{nltem=m_list.GetNextSelectedIteiTi(pos);if(McssagcBox("真的要删除此记录吗?丁提示MB_YESNO)==IDYES){m_list.DeleteItem(nItem);//deletedatabasem_dataRecset->MoveFirst();m_dataRecset->Move(nltem,SQL_FETCH_RELATIVE);if(m_dataRecset->CanUpdate()){m_dataRecset->Delete();m_dataRecset->MoveNext();}②OnBumrnFind()函数当用户单击"查找”按钮时触发OnButtonFind()函数,对应的代码如卜:voidCBookDialog::OnButtonFind(){CFindDlgdig;CStringszltem,szValue,szFind;intnlndex=();if(dlg.DoModal()==IDOK){CFamilytreeApp*pApp=(CFamilytreeApp*)AfxGetApp();szItem.EmptyO;szltem=pApp->m_szSelectltem; szValue.EmptyO;szValue=pApp->m_szValue;if(szltem=="姓名")nlndex=1;elseif(szItem==,,EMAILn)nlndex=2;elseif(szItem==MQQn)nlndex=3;elseif(szltcm=="手机号码")nlndcx=4;elseif(szltem=="电话号码")nlndex=5;elseif(szltem=="生日")nlndex=6;elseif(szltem=="工作单位")nlndex=7;elseif(szltem=="个人主页")nlndex=&elseif(szltem=="备注")nlndex=9;BOOLbFind=FALSE;intnItemFind=();m_dataRecset->MoveFirst();while(!m_dataRecset->IsEOF()){switch(nlndex){case1:if(m_dataRecset->m_name.Find(szValue)!—1)bFind=TRUE;break;case2:if(m_dataRecset->m_email.Find(szValue)!=-l)bFind=TRUE;break;case3:if(m_dataRecset->m_qq.Find(szValue)!=-l)bFind=TRUE;break;case4:if(m_dataRecset->m_mobile.Find(szValue)!—1)bFind=TRUE;break;case5:if(m_dataRecset->m_phone.Find(szValue)!=-l)bFind=TRUE;break;case6:if(m_dataRecset->m_birthday.Find(szValue)!=-l)bFind=TRUE;break; case7:if(m_dataRecset->m_workunit.Find(szValue)!=-l)bFind=TRUE;break;case8:if(m_dataRecset->m_homepage.Find(szValue)!=-l) bFind=TRUE;break;case9:if(m_dataRecset->m_demo.Find(szValue)!=-l)bFind二TRUE;break;}if(bFind)break;m_dataRecset->MoveNext();nItemFind++;}if(!bFind){MessageBox(H通讯录中没有此记录!”,”提示“,MB_OK);return;m_dataRecset->MoveFirst();m_dataRccsct->Movc(nltcmFind,SQL_FETCH_RELATIVE);//CSuperWorldApp*pApp=(CSuperWorldApp*)AfxGetApp();pApp->m_bookData.szNamepApp->m_bookData.szEmailpApp->m_bookData.szqqpApp->m_bookData.szMobilepApp->m_bookData.szPhone=m_dataRecset->m_name;=m_dataRecset->m_email;=m_dataRecset->m_qq;=m_dataRecset->m_mobile;=m_dataRecset->m_phone;=m_dataRecset->m_demo;=dlg.m_name;=dlg.m_cmail;=dlg.m_qq;=dlg.m_mobile;pApp->m_bookData.szBirthday=m_dataRecset->m_birthday;pApp->m_bookData.szWorkUnit=m_dataRecset->m_workunitpApp->m_bookData.szHomcpagc=m_dataRccsct->m_homcpagc;pApp->m_bookData.szDemoCPropertyDlgdig;if(dlg.DoModal()==IDOK){m_dataRecset->Edit();m_dataRecset->m_namem_dataRccsct->m_cmailm_dataRecset->m_qqm_dataRecset->m_mobilem_dataRecset->m_phone =dlg.m_phone;m_dataRccsct->m_birthday=dlg.m_birthday;m_dataRecset->m_workunit=dlg.m_unit;m_dataRecset->m_homepage=dlg.m_homepage;m_dataRecset->m_demo=dlg.m_demo;m_dataRecset->Update();m_list.SetItemText(nItemFind,O,dlg.m_name);m」ist.SctItcmTcxt(nItcmFind,1,dlg.m_cmail);m_list.SetItemText(nItemFind,2,dlg.m_qq);m_list.SetItemText(nItemFind,3.dlg.m_mobile);m」ist.SetItemText(nItemFindAdlg.m_phone);m_list.SetItemText(nItemFind,5,dlg.m_birthday);m」ist.SetItemText(nItemFind,6,dlg.m_unit);m_list.SetItemText(nItemFind,7,dlg.m_homepage);m_list.SetItemText(nItemFind,8,dlg.m_demo);4.6备忘录模块4.6.1模块描述该模块R是从属于通讯录模块中的一个功能,但是创建了一个新的对话框。系统用户间的沟通与交流,除了使用Ema订之外,述可以通过创建备忘录进行留言。创建一个新对话框,对话框属性为IDD_DIALOG_WORLD,它的类为CWorldDialog.cppo4.6.2主要程序清单voidCWorldDialog::OnButtonNew(){//TODO:AddyourcontrolnotificationhandlercodehereCStringszBuffer;szBuffe匚Empty。;m_edit.GetWindowText(szBuffer);if(!szBuffer.IsEmpty())//notnull{if(m_edit.GetModify()){intnRes=MessageBox(n是否保存当前的备忘录?”,”提示”,MB_YESNO|MB_ICONQUESTION);if(nRes==IDYES){//SAVETCHARszTempPath[4(X)];TCHARszBuffer[400];memset(szBuffer,0,sizeof(szBuffer));memset(szTempPathX),sizeof(szTempPath)); CFamilytreeApp*pApp=(CFamilytreeApp*)AfxGetApp();if(::GctModulcFilcNamc(NULL,szBuffcr,MAX_FATH)!=0){pApp->GetCurDir(szBuffer,szTempPath);}lstrcat(szTempPath,"备忘录”);//createdirectoryWIN32_FIND_DATAFindFileData;HANDLEhFind;hFind=::FindFirstFile(szTempPath,&FindFileData);if(hFind==INVALID_HANDLE_VALUE){::CrcatcDircctory(szTcmpPath,NULL);}elseFindClose(hFind);//CStringstr;TCHARszFileName[30];memset(szFileName,0,sizeof(szFileName));CTimetime;m_datc.GctTimc(timc);//str=time.Format(_T(n%X"));wsprintf(szFileName,",%d-%d-%d.dat",time.GetYear(),time.GetMonth(),time.GetDayO);Istrcat(szTempPath,"\");lstrcat(szTempPath,szFileName);CFileDialogdlg(FALSE,udatH,szTempPath,OFN_HIDEREADONLY|OFN.OVERWRITEPROMPT,”备忘录文件(*.dat)|*.dat||H);if(dlg.DoModal()==IDCANCEL){return;}else{CStringszPathName;szPathName.EmptyO; szPathName=dlg.GetPathName();CFilehFile;CFilcExccptionc;if(!hFile.Open(szPathName,CFile::modeCreate|CFile::modeWrite,&e)){AfxMessageBox(M创建文件失败!”,MB_OK);return;}CStringszText;szText.EmptyO;//writeheadCStringszWcck;szWeek.EmptyO;m_week.GetWindowText(szWeek);CStringszWeather;szWeather.Emp(y();m_weather.GetWindowText(szWea(her);hFile.Seek(NULL,CFile::current);szText.Format(M日期:%s%s天气:%srn,szFileName,szWeek,szWeather);hFilc.Writc(szTcxt,szTcxt.GctLcngth());szText.EmptyO;szText=nrn";hFile.Seek(NULL,CFile::current);hFile.Write(szText,szText.GetLength());szText.EmptyO;m_cdit.GctWindowTcxt(szTcxt);hFile.Seek(NULL,CFile::current);hFile.Write(szText,szText.GetLength());hFile.Close();m_edit.SetWindowText(nn);m_szFileName.Empty(); }m_edit.SetFocus();}voidCWorldDialog::OnButtonSave(){//TODO:Addyourcontrolnotificationhandlercodehereif(m_szFileName.IsEmpty()){//SAVETCHARszTempPath[400];TCHARszBuffer[400];mcmsct(szBuffer,0,sizcof(szBuffcr));memset(szTempPath,(),sizeof(szTempPath));CFamilytreeApp*pApp=(CFamilytreeApp*)AfxGetApp();if(::GetModuleFileName(NULL,szBuffer,MAX_PATH)!=0){pApp->GetCurDir(szBuffer,szTempPath);}lstrcat(szTempPath,"备忘录”);//createdirectoryWIN32FINDDATAFindFileData;HANDLEhFind;hFind=::FindFirstFile(szTempPath,&FindFileData);if(hFind==INVALID_HANDLE_VALUE){::CreateDirectory(szTempPath,NULL);}elseFindClosc(hFind);//CStringstr;TCHARszFileName[30];mcmsct(szFilcNamc,0.sizcof(szFilcNamc));CTimetime;m_date.GetTime(time);//str=time.Foirnat(_T(”%X”));wsprintf(szFileName/,%d-%d-%d.dat,time.GetYear()4ime.GetMonth()4ime.GetDay());lstrcat(szTempPath,M\");lstrcat(szTcmpPath,szFiIcNamc);CFileDialogdlg(FALSE,”dat”,szTempPath,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, ”备忘录文件(*dat)|*.dat||n);if(dlg.DoModal()==IDCANCEL){return;}else{CStringszPathName;szPathNamc.EmptyO;szPathName=dlg.GetPathName();m_szFileName.Empty();m_szFileName=szPathName;CFilehFile;CFileExceptione;if(!hFile.Open(szPathName,CFile::modeCreate|CFile::modeWrite,&e)){AfxMessageBox(u创建文件失败!”,MB_OK);return;}CStringszText;szText.EmptyO;//writeheadCStringszWeek;szWeek.Empty();m_wcck.GctWindowTcxt(szWcck);CStringszWeather;szWeather.Empty();m_weathe匚GetWindowTexi(szWeafher);hFile.Seek(NULL,CFile::current);szText.Format("日期:%s%s天气:%srnrszFileNaiTie,szWeek,szWeather);hFile.Write(szText,szText.GetLength());szText.EmptyO;szText="rnH;hFile.Seek(NULL,CFile::current);hFile.Write(szText,szText.GetLength()); szText.EmptyO;m_edit.GetWindowText(szText);hFile.Seek(NULL,CFile::current);hFile.Write(szText,szText.GetLength());hFile.Close();if(IDYES==MessageBox(n保存成功,开始新的备忘录?“,“提示",MB_YESNO|MB」CONQUESTION)){m_edit.SetWindowText(,H,);m_edit.SetFocus();m_szFileName.Empty();}}}else{//SAVECStringszPathNamc;szPathName.EmptyO;CFilehFile;CFileExceptione;if(!hFile.Open(m_szFileName,CFile::modeCreate|CFile::modeWrite,&e)){AfxMessageBox(H创建文件失败!”,MB_OK);return;CStringszText;szText.EmptyO;CStringszFilc;TCHARch="V;in(n=m_szFileName.ReverseFind(ch);if(n!=-l){szFile=m_szFileName.Mid(n+1);}//writeheadCStringszWeek;szWeek.EmptyO;m_week.GetWindowText(szWeek); CStringszWeather;szWeather.Emp(y();m_weather.GetWindowTex((szWeather);szText.EmptyO;m_edit.GetWindowText(szText);hFile.Seek(NULL,CFile::current);hFile.Write(szText,szText.GetLength());hFile.Close();if(IDYES=MessageBox(n保存成功,开始新的备忘录?丁提示n,MB_YESNO|MBJCONQUESTION)){m_edit.SetWindowText(,r");m_edit.SetFocus();m_szFileName.Empty();}})voidCWorldDialog::OnButtonOpen(){//TODO:AddyourcontrolnotificationhandlercodehereCFamilytreeApp*pApp=(CFamilytreeApp*)AfxGetApp();CStringszBuffer;szBuffcr.EmptyO;CStringszFileName;szFileName.EmptyO;//intiReturn;TCHARszTcmpBuffcr[MAX_PATH]={0};TCHARszCurDir[MAX_PATH]={0};memset(szTempBuffer,0,sizeof(szTempBuffer));if(::GetModuleFileName(NULL,szTempBuf"fer,MAX_PATH)!=0){pApp->GetCurDir(szTempBuffer,szCurDir);}lstrcat(szCurDir,"备忘录”);WIN32_FIND_DATAFindFileData;HANDLEhFind;hFind=::FindFirstFile(szCurDir,&FindFileData);if(hFind==INVALID_HANDLE_VALUE) {::CreateDirectory(szCurDir,NULL);}elseFindClose(hFind);lstrcat(szCurDir,"\");::SetCurrentDirectory(szCurDir);OPENFILENAMEof;TCHARszFileNamel[MAX_PATH]={0};constLPTSTRpszOpenFilter=TEXT(“备忘录文件(*.dat)*.datH);INTrc;HANDLEhFile;memset(&of,0,sizeof(of));of.lStructSize=sizeof(of);of.hwndOwncr=NULL;of.lpstrFile=szFileNamel;of.nMaxFile=sizeof(szFileNamel);of.lpstrFilter=pszOpenFilter;of.Flags=0;rc=GetOpenFileName(&of);hFilc=CrcatcFiIc(szFilcNamc1,GENERIC_READ|GENERIC_WRITE,(),NULL,OPEN_EXISTING,FILEATTRIBUTENORMAL,MBNULL);if(INVALID_HANDLE_VALUE=hFile){return;}m_cdit.SctWindowTcxt(""^);m_szFileName.Empty();m_szFileName=szFileNamel;DWORDdwBytes;DWORDdwFileSize=GetFileSize(hFile,NULL);TCHAR*szText; szText=newTCHAR[dwFileSize];ReadFile(hFile,szText,dwFileSize,(LPDWORD)&dwBytes,0);m_edit.SetWindowText(szText);CloscHandlc(hFilc);deleteszText;}4.7音乐管理模块4.7.1模块描述出现音乐管理⑼对话框的1D屈性为IDD_SETTINGo对话框类为CSettingDlgo4.7.2主要程序清单voidCSettingDlg::OnOK(){//TODO:AddextravalidationhereUpdatcData(TRUE);if(m_bMusic==TRUE){if(m_strMusicFileName.IsEmpty()){MessageBox("你已选择了播放音乐,请指定mp3音乐文件名!",”音乐H,MB_OK|MBJCONINFORMATION);return;if(!m_strMusicFileName.IsEmpty()){if(m_strMusicFileName.Right(3)!=Hmp3H){McssagcBox(H所选文件不是mp3文件!丁音乐”,MB_OK|MB_ICONWARNING);return;}FILE*f;f=fopen(m_strMusicFileName,MrH);if(f=NULL){McssagcBox(H所选文件不存在!”,”音乐“,MB_OK|MB_ICONWARNING);return;}fclose(f);)AfxGetApp()->WriteProfileInt(_T(H参数“),_T(”musiconoff"),m_bMusic); AfxGetApp()->WriteProfileString(_T("参数M),_T(nmusicfilename"),m_strMusicFileName);CDialog::OnOK();}voidCScttingDlg::OnOpcn(){//TODO:AddyourcontrolnotificationhandlercodehereCStringstrFilter=nMP3文件(*.mp3)|*.mp3n;CFileDialogfileopen(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,strFilter);if(fileopen.DoModal()==IDOK)m_strMusicFileName=fileopen.GetPathName();UpdateData(FALSE); 5・系统测试和应用5.1系统测试5.1.1关于软件测试软件测试I®就是在软件投入运行之前,对软件需求分析、设计规格和编码实现的最终审查,它在软件生存期中占有非常突出的位置,是保证软件质量的重要手段。按照测试用例的设计方法,可以分为白盒测试和黑盒测试。在这里主耍是运用黑盒测试。5.1.2盒测试黑盒测^[101(Black-Box-Testing)又称为功能测试,是一种从用户观点出发的测试。用这种方法进行测试吋,把被测试程序当作一个黑盒,在不考虑程序内部结构和内部特性,测试者只知道该程序的输入和输出之间的关系或程序的功能的情况下,依靠能够反映这一关系的软件需求规格说明书,来确定测试用例和推断测试结构的正确性。软件的黑盒测试被用来证实软件功能的正确性和可操作性。该系统的黑盒测试内容及结果如表5所示。表5序号测试模块测试内容测试函数结果1系统用户管理登陆验证CLoginDlgO成功2系统用户管理添加用户OnUdBadd()成功3系统用户管理注销用户OnUdBdelO成功4系统用户管理修改密码OnUdBmodifyO成功5基本信息管理音乐播放CSettingDlgO成功6基本信息管理通讯录CBookDialogO成功7基木信息管理备忘录CWorldDialogO成功8基木信息管理帮助CAboutDlgO成功9基本信息管理关于本系统CAboutDlalog(0成功10家族信息管理添加孩子OnAdd()成功11家族信息管理删除孩子OnDelete()成功12家族信息管理修改资料OnModifyO成功13家族信息管理确定两人关系OnFamilytreeRelations()成功14家族信息管理某代信息OnFamilytreeIgenerationInfo()成功15统计查询模块按生口排序OnFamilytreeSort()成功16统计查询模块按姓名查找OnFamilytreePersonalInfo()成功17统计查询模块按生FI查找OnBirthdayO成功18统计查询模块通讯录成员查找OnButtonFind()成功 5.2系统应用木系统主要运用于家族事业管理,它为用户进行成员管理、基本信息管理以及统计查询等工作提供便捷的服务。作为家族事业管理的一部分,它规范家族人员信息化管理,改变了传统方法繁琐、保存不便的弊端,是现代家族事业管理必不可少的一部分。同时,随着现代社会的发展,家族信息管理系统也将逐步运用于城屮村管理,并发挥巨大作用。由于吋间仓促以及木人的开发经验有限,该系统只能实现基木的功能,还不能完全满足不同用户的各种需求。 6.结语与展望本项目是对家族信息管理系统的实现,是使用MicrosoftVisualC++平台屮的MFC规范进行了家族信息管理系统基本功能的开发,在通过了解家族信息管理系统发展现状和趋势,以及对于开发该系统相关技术的进一步了解的基础上,对该系统进行了分析、设计和实现,基本上完成了系统的界而设计、系统管理模块、家族信息管理模块、基本管理模块、统计查询模块等部分,并给出了整个系统的完整代码。本系统使用了MFC的一些基本方法,而后续的工作则是运用ODBC技术更进一步完善该系统的功能和性能。从近几年的发展趋势可以看出,具有家族成员统计管理功能的系统软件越来越多,功能也是越来越强大,已经成为家族信息管理软件发展的一个大趋势。在设计此系统时,由于时间仓促以及个人能力所限,家族信息管理系统仍存在一些不足的地方,例如:系统界而界而有好但美工不够精美优雅,系统功能尚未完善,没有跟上时代的潮流将系统实现智能化等等,这些均为以后努力方向。 参考文献[1]杨富国,王浩,唐巧琪等.VisualC++程序开发案例解析.北京:清华大学出版社,北京交通人学出版社,2006.3-5.[2]刘璟,周玉龙.高级语言C++程序设计(第二版).北京:高等教育出版社,2006.11-15.[3]廖望,叶杰宏.中文Access2003案例经典.北京:冶金工业出版社,2005.18-26,45-82.[4]陈明.软件工程使用教程.北京:电了工业出版社,2006.62-72.[5]邱郁惠.系统分析师UML实务手册,北京:机械工业出版社,2008.23.[6]严蹌敏,吴伟民.数据结构(C语言版).北京:清华大学出版社,2006.121.[7]王珊,萨师熄.数据库系统概论(第四版)•北京:高等教育出版社,2007.18-20.[8]侯其锋,李晓华,李莎.VisualC++数据库通用模块开发与系统移植,北京:清华大学出版社,2007.81-86.[9]明II科技.VisualC++管理信息系统完整项目实例剖析,北京:人民邮电出版社,2005.95-101.[10]路晓丽,葛纬,龚晓庆等•软件测试技术.北京:机械工业出版社,2007.6-8,35. 两个多月家族信息管理系统开发丿力程,可以说既是一次回顾已学专业知识的过程,也是一次学习新开发技术知识的过程。为了增长我的专业知识,我翻阅过许多的参考资料,浏览过无数的网页,也请教过很多的同学。本设计和论文都是在胡玉平老师的悉心指导下完成的。首先要感谢老师一直以来的关心、督促和建议。他严谨求实的治学态度、高度的敬业精神、兢兢业业、孜孜以求的工作作风和大胆创新的进取精神对我产生重耍影响。他渊博的知识、开阔的视野和敏锐的思维给了我深深的启迪。另外,要感谢舍友们对我系统设计以及论文写作的指导,她们为我完成这篇论文提供了许多的帮助。更要感谢鱼旦同学对我的无私帮助,使我得以顺利完成系统开发。述要感谢默默地鼓励和支持我的家人们!最后,再次对关心、帮助我的老师和同学表示衷心地感谢!