代码改变世界

我的毕业设计---高校奖金管理系统的设计及实现

2007-04-01 20:49  ruinet  阅读(4894)  评论(7编辑  收藏  举报

高校奖金管理系统的设计及实现

1.引言--- 4

2.系统分析--- 5

2.1 可行性分析--- 5

2.1.1技术可行性--- 5

2.1.2经济可行性--- 5

2.1.3运行可行性--- 5

2.2开发工具选择--- 5

2.2.1开发平台选择--- 5

2.2.2数据库的选择--- 6

2.3对现有奖金管理的了解--- 6

2.4用户需求分析--- 7

2.5系统用例图--- 7

3.系统设计--- 8

3.1总体设计分析--- 8

3.1.1系统设计的关键性问题--- 8

3.2 数据库设计--- 9

3.2.1数据库设计思想--- 9

3.2.2数据库的详细设计--- 9

3.2.3数据库E-R--- 9

3.3 功能模块设计--- 10

3.3.1功能模块设计分析--- 10

3.3.2功能模块图--- 10

3.3.3奖金审核顺序图--- 11

3.4数据设计--- 12

3.4.1数据流图--- 12

3.4.2数据字典--- 12

3.5模块详细设计--- 13

3.5.1用户登陆模块--- 13

3.5.2奖金录入模块--- 14

3.5.3奖金统计模块--- 14

3.5.4奖金审核模块--- 15

3.5.5奖金查询模块--- 15

3.5.6个人信息修改模块--- 15

3.5.7教师管理模--- 15

3.5.8账号管理模块--- 15

3.5.9比例设计模块--- 15

3.5.10软件设置模块--- 16

3.5.11密码修改模块--- 16

3.5.12留言模块--- 16

4.系统实施--- 16

4.1界面设计及功能实现--- 16

4.1.1主框架--- 16

4.1.2奖金录入--- 17

4.1.3奖金审核--- 18

4.1.4奖金统计--- 19

4.1.5比例设置--- 20

4.1.6月记录的生成--- 21

4.2主要算法和代码的实现和分析--- 21

4.2.1窗口的嵌套--- 21

4.2.2 Flash的创建--- 21

4.2.3给树形控件加背景图片--- 21

4.2.4加载XP样式皮肤--- 23

4.2.5封装ADO对象--- 23

4.2.6按需读取数据--- 26

4.2.7SQL Server数据库作为服务器--- 27

4.2.8窗口前置--- 27

4.2.9链表的使用--- 27

4.3系统测试--- 27

4.3.1测试计划和任务--- 27

4.3.2测试过程--- 28

4.3.3测试结果--- 28

5.结束语--- 29

参考文献--- 29

正文 

高校奖金管理系统的设计及实现

――张锐

【摘要】教师奖金管理是各高校管理中的一个重要的内容。随着高校规模的增大,奖金的管理变得更为复杂。而实行电子化管理可以使管理人员从的繁重工作解脱出来。本文结合我校的实际情况,用软件工程的思想,从高校奖金管理系统的需求分析、系统设计到系统的实施等几个方面阐述高校奖金管理系统开发的整个过程和实现思想,最后是对开发本系统的一个总结。

 

【关键字】管理系统,奖金管理, C/S, Visual Studio C++,系统开发,SQL Server

 

AbstractManaging teacher’s bonuses is a management important content. Increases along with the college personnel quantity, college 's bonuses supervisory work also changes more and more complex.

Implement electron manage make manager disembarrass from hard work. The these combines actual condition of my school, with software engineering thought from systematic demand analysis, system design to actualization of system, expatiates entire process of college bonuses manage system and thought of implementation. last it’s summarizer of empoldering this system.

Key wordsmanage system,bonuses manage,C/S, Visual Studio C++,system empolder,SQL Server

 

 

 

1.引言

随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机信息系统进行管理,具有手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高企业信息管理的效率,也是企业的科学化、正规化管理,与世界接轨的重要条件

教师奖金管理是各高校管理中的一个重要的内容。随着高校规模的增大,教师的奖金管理变的越来越复杂。

《高校奖金管理系统》是一套对教师奖金信息管理的信息管理软件,前台程序开发工具采用微软VC++ 6.0,后台数据库采用SQL Server 2000。采用该系统可以使教师奖金系统化,规范化,自动化,提高管理的效率,保证奖金信息的正确、安全性

本文结合我校(海南软件职业技术学院)的实际情况进行需求分析,用软件工程的思想阐述了系统的实现过程和开发思想。从系统的需求分析、系统设计到系统的实施,对该系统开发中的关键问题、设计思想、关键技术进行了详细的阐述。

在需求分析章节,本文从对系统的可行性分析、开发工具的选择、对现有奖金管理的了解、用户需求分析等几个方面阐述了在系统需求分析阶段的关键问题。写到需求分析了解到的用户功能,开发工具的选择。用UML用例图(Use Case Diagram)描述系统的用例和参与者,用现有奖金管理的记录文件描述了现有奖金的管理办法和计算方法。

在系统设计章节,对系统概要设计和详细设计中的关键问题进行阐述。对系统设计的关键性问题和实现方法进行了讲述。对数据的设计,用E-R描述了数据库的概念模型,用表关系图描述了数据库的关系模型。通过对系统模块划分,可以更清楚看出整个系统的结构。其中有系统的功能模块图,其中还有顺序图(Sequence Diagram)描述奖金审核的顺序。用文字详细的简述了系统各模块的功能,对系统的实施进行铺垫。

在系统的实施章节,描述了系统详细设计阶段的关键问题。从几个关键模块的设计,阐述了系统的实现。结合界面的设计,讲述了界面的设计、模块功能的实现和编码过程。同时还有对系统中的关键算法和代码的实现和分析进行了阐述。

最后是对该系统开发的一个总结,以及从中的受益。

 

2.系统分析

2.1 可行性分析

2.1.1技术可行性

最近30年来,管理信息系统技术得到了充分的发展与完善,使得开发本系统在技术可行性成为可能,利用Visual Studio C++ 6.0开发工具,使得本系统不存在技术上的障碍。

2.1.2经济可行性

参与本系统的研发工作,主要是为了综合运用在计算机方面所学的各科知识,通过理论与实践的结合,提高本人的专业技术知识的应用能力,所以报酬上也没想那么多。但系统在实际的运行,会大大节省人力资源提高办公效率,方便奖金的管理。

2.1.3运行可行性

系统可以运行平台windows系列,服务器端要求SQL Server 2000做为后台数据库。而客户端用户只要下载安装程序,并windows平台下及可运行。根据我校实际,这样的要求不存在问题。

2.2开发工具选择

2.2.1开发平台选择

根据参加开发人员的技术水平和对比个中开发平台,我们选择了Visual Studio C++ 6.0作为开发平台。

Visual Studio C++ 6.0是功能最为强大可视化开发工具,它不仅支持传统的软件开发方法,更重要的是它能支持面向对象、可视化的开发风格。因此Visual Studio C++ 6.0又称作是一个集成开发工具,它提供了软件代码自动生成和可视化的资源编辑功能。

Visual Studio C++ 6.0具有的优点:提供了面向对象的应用程序框架MFCMicrosoft Foundation Class,简化了程序员的编程工作,提高了模块的可重用性;提供了基于CASE技术的可视化软件的自动生成和维护工具AppWizardClassWizardVisual StudioWizardBar等,实现了直观、可视的程序设计风格,方便地编和管理各种类,维护程序的源代码;封装了WindowsAPI函数、USERKERNELGDI函数,简化了编程时创建、维护窗口的许多复杂的工作[1]

Visual Studio C++ 6.0中可用的数据访问对象接口有三种:ODBCOpen Database Connectity,开发数据库连接)、DAO(Data Access Objects,数据访问对象)OLE DB(OLE data BaseOLE数据库)

本系统采用基于OLE DBADO访问数据库技术。ADO是微软提出的最新的数据库访问技术,是基于OLE DB 的访问接口技术,由于其功能强大,已基本取代了ODBC DAOADO技术是基于COM 的特性,使ADO技术应用与很多编程环境[2],如VC++

2.2.2数据库的选择

在数据库的选择上,我们选择的是SQL Server 2000

SQL Server 2000 具有非常强大的关系数据库的创建、开发、设计及管理功能,并对Microsoft 公司的其它产品及第三方产品具有良好的兼容性,能方便地实现无缝操作。此外,SQL Server 2000对开发工具提供良好的支持,能为大型数据库项目提供优秀的企业解决方案[2]

同时由于SQL Server 2000Visual Studio C++ 6.0都是微软的产品,它们的兼容性强,性能优越、界面友好。而且ADO数据访问接口技术先进,学习起来简单,便于快速开发。基于Visual Studio C++ 6.0SQL Server 2000各自的优点以及其双方相兼容的好处,选用了这两种工具来完成本次毕业设计。

 2.3对现有奖金管理的了解

现在的奖金管理主要是由各系的奖金管理人员每月其中登记教师的工作量信息,用Excel记录和计算,然后得出结果后交有上级审查,校长签字生效。

奖金的计算方法大致是:根据教师的情况录入课时和教案,并将全部转换成中专课时,全部相加后成为周课时总量,超课课时=周总课时-周基本课时。再按超课课时的计算比例计算超课课时分,计算范围为:没有超过的、超过一段的和超过二段的。最终周记录的的奖金分数=周基本课时分+一段超课课时分+二段超课课时分。如下图2-1是登记教师每周工作量的Excel表的一部分:


2-1  周记录登记表

月记录奖金是将4个周的奖金分数加在一起,同时还要加教师的职务津贴,特殊津贴,班主任津贴,通讯费。如下图是2-2最终交给校长签字确认得Excel表的一部分:

2.4用户需求分析

要使最终的软件能够满足用户的需求,最重要的就是要和用户沟通,了解用户的需要。这也是我们开始做的工作。根据不断的和用户沟通,同时对现有奖金的管理方法的了解和研究。对用户的的需求和系统要实现的功能了大致的了解。可以总结如下几点:

   1)能够连网操作,不随时间的限制。

   2)要求由普通用户也录入自己的奖金信息。

   3)按系进行管理,但采用相同的计算比例和方法。

   4)计算要准确。

   5)系统要安全。

   6)普通教师录入的信息必须确认才有效。

   7)能对最终的奖金数据按不同条件进行统计。

   8)能对各种奖金信息进行计算,并能随时修改奖金计算比例

   9)操作要简单。

   10)要有留言功能。

    (11)用户要分等级。

(12) 最终要能打印供校长确认签字。

(13) 奖金的计算项目包括:课时数,教案数,公开课,合班课,毕业指导,专升本,出题,监考,巡考,阅卷,选修课。教案和课时各有三类计算比例各不同;课时和教案又分为大专课时和中专课时;公开课分为:系公开课,院公开课,院外公开课。合班课时按上课人数不同来算。

14)报表打印功能。

2.5系统用例图

用例图主要是对系统的行为建模,描述系统与参与者之间的相互作用,也可以说是从用户的角度出发对如何使用系统的描述[3]。用例图建立完成,就需要编写用例描述,用例描述也是对系统各功能进行的描述,这一步是系统进一步设计的一个重要过程。准确地描述出系统的功能有助于理清设计的思路,更是和用户进行交流沟通的保障。如下图2-3是根据系统的需求分析,利用Rational Rose对系统建模的用例图

2-3 系统用例图

3.系统设计

3.1总体设计分析

3.1.1系统设计的关键性问题

在对系统需求进行研究后有如下几个关键性问题是进行系统设计必须考虑到的:

要系统安全,计算准确;

要能奖金计算的各个项目都要考虑到;

要能查询保存奖金填写原始数据;

能适应系统的变化;

要解决上述有如下解决思路:要能计算准确,系统安全,必须在数据库设计和代码编写时对原始的数据有效位数进行合理的设计,同时采用奖金确认机制,只有经过确认的信息才有效。

奖金计算的项目繁多,又要保存奖金填写的原始数据,同时系统变化又很大,要使最终能达到用户的需求,就得在设计数据库时考虑好这些问题,使要能实现需求不产生数据冗余。

3.2 数据库设计

3.2.1数据库设计思想

系统设计开始,首先考虑如何用数据模型来描述数据库的结构与语义,以对现实世界进行抽象。目前广泛使用的数据模型可分为两种类型,一种是独立于计算机系统的概念数据模型(如实体联系模型);另一种是直接面向数据库逻辑结构的结构数据模型。在本系统中采用了实体联系模型E-R模型)来描述数据库的结构与语义,以对现实世界进行第一次抽象[4]

同时要解决上述的系统设计中的一些关键性问题,很大程度上要在数据设计上,因此数据的设计至关重要。

设计的总要原则是以数据库设计的规范,以软件实际出发。不单纯的追求数据达到范式的高低,以数据库的实际运行效率为目标。

3.2.2数据库的详细设计

   1)教师信息表:包括教师号,教师名,职务,职称,学历,电话,Email,所属系别,班主任类型9个字段。主要是根据奖金计算中要用到的一些关系来取舍,同时由于本系统只是一个管理奖金信息的系统而不是管理教师信息的系统对于如:性别,年龄等信息都省略了以减轻系统在数据管理上的负担和减小对网络资源的占用。

   2)系别信息表:包括有系名,系主任,系秘书3个字段。该表也表也很简单。

   3)周记录表:包括有教师号,周,总奖金,实际课时,基本课时数,总教案数,一段超课课时,二段超课课时,合班课时,公开课,阅卷,出题,巡考,监考毕业指导,专升本,备注,一类大专课时,一类大专教案,二类大专课时,二类大专教案,一类中专课时,一类中专教案,二类中专课时,二类中专教案,特殊津贴,系秘书确认26个字段。该表比较复杂,主要是由于奖金的计算项目繁多,同时又的保存奖金原始数据。

   4)月记录表:包括教师号,月,一周总分,二周总分,三周总分,四周总分,职务补贴,学历补贴,通讯费,备注,总分,主任确认,校长确认12个字段。

   5)留言信息表:包括发信人,收信人,内容,留言时间4个字段。

   6)用户管理表:包括用户名,密码,教师号,系别4个字段。

   7)其它表:上面的表外,还有11张表,都是用来保存奖金计算各种比例的。这些比例有:教案转课时换算比例,课时大专转中专换算比例,教案大专转中专换算比例,超课时计算比例,职称比例,职务比例,合班比例,专升本上课比例,毕业指导比例,课类型转换比例,监考补贴比例,巡考补贴比例,阅卷补贴比例,出题补贴比例,选修课比例,班主任补贴比例,通讯费比例。

   8)还包括一个视图,它主要是为了奖金的统计。因为奖金统计时按不同条件查询时会涉及到多张表,这样查询起来效率比较低,而且查询也很复杂。而应用视图就很好的解决了这个问题。该视图包括:教师号,教师名,系别,学历,职务,职称,月奖金总数,月,班主任类型。

3.2.3数据库E-R

如下图3-1  (说明:其它比例表的E-R图省略)

3-1 数据库E-R

 

3.3 功能模块设计

3.3.1功能模块设计分析

在系统分析的基础上和对系统功能的抽象、初步求精将系统分为了4个一级模块,一级模块又分为12个子模块。强调模块间的独立性,不同模块间的相互依赖的紧密程度要低,即耦合性要低;模块内部各元素彼此结合的紧密程度要高,即内聚性要高。

3.3.2功能模块图

如下图3-3

3-3系统功能模块图
 

3.3.3奖金审核顺序图

  如下图3-4


3-3 奖金审核顺序图

3.4数据设计

3.4.1数据流图

数据流图时结构化设计分析的主要技术它简单、有效,能够帮助系统分析人员更好地理解和掌握程序的数据流向和逻辑[4]


3-4顶层数据流图

3.4.2数据字典

数据字典(Data Dictionary,简称DC)是结构化设计与分析理论中的两个重要的工具之一。它主要是对系统中的将要涉及的数据项的名称、说明及数据组成进行标准化、系统化描述。由于篇幅有限本文只对系统中的重要数据项和数据库的关键表的数据设计进行记录了:[6]

重要数据项:

教师基本信息=教师号+教师名+职务+职称+学历+系别+联系方式+(班主任类型)+是否离校;

周记录时间={6…9}1[1|2]{0|1|3}{0…9}1;

月记录时间={6…9}1[1|2]{0…9}1;

联系方式=Email|电话;

系别信息=系名+系主任+系秘书;

账号=账号+系名+所属教师号;

周记录信息=教师号+周课时数+周教案数+周总奖金数+(公开课)+(合班课)+(监考)+(阅卷)+(出题)+巡考+(选修课)+(专升本)+备注+周时间;

月记录=教师号+月时间+月奖金总数+1周奖金+2周奖金+3周奖金+4周奖金+备注+职务补贴+特殊津贴+(通讯费)

数据库字段设计:

表名

字段名

类型

说明

ScaleLP(主要比例)

Lscale

float  

课时

LPScale

float

教案

PScale

float  

课时与教案

SPost(职称)

Post

Varchar(20)

职称名

Pscale

float

职称比例

Sduty(职务)

Duty

Varchar(20)

职务名

Dscale

float

通讯费

XXF

float

通讯费

ScaleR(专升本)

Rscale()

int

专升本比例

SLType(课类型)

LType

Varchar(20)

课类型

LScale

float

课比例

SOver(超课比例)

[Over]

int

超课数

BScale

float

超课比例

cklx

Varchar(5)

超课段

ScaleOpen(开课比例设置)

LOpen

Varchar(10)

公开课类型

OScale

float

公开课比例

SbzrType(班主任比例设置)

BzrType

Varchar(20)

班主任类型

BzrScal

float  

班主任比例

SaddClass(合班比例设置)

AddClassmin

int

合班的最小人数

AddClassmax

int

合班的最大人数

CScale

float  

合班的比例

ScaleF(毕业指导)

FScale

float  

毕业的指导

 

 




























3.5
模块详细设计

3.5.1用户登陆模块

用户登陆时,要对用户的权限进行验证,同时还要对用户的身份进行判别。系统初始化时给每个普通教师一个用户账号,用户名和密码分别是教师名和教师号,用户登陆成功后可以对自己的账号进行更改。如果登陆成功将根据不同的用户生成不同的主界面。下面是采用UML对系统登陆进行建模,如下图3-5的登陆的活动图,从中你可以清楚看出系统登陆的流程。


3-5 系统登陆活动图

 

3.5.2奖金录入模块

奖金录入是用来系统的主要模块,也是系统较复杂的一块。该模块的主要功能和作用:用户数据的录入和是原始奖金数据写入数据库。该处要录入根据自己周记录的情况录入自己相应的数据,主要有的周课时和教案数,这是每个老师每周必须录入,还有的是一些不常录入的数据,主要包括公开课数、专升本数、补课数、出题、监考、巡考、阅卷等。

该模块设计的主要问题和解决方案:

奖金的计算的项目繁多,怎样才能让用户更清楚的录入自己该录入的信息,同时保证用户操作的正确性。

解决这个问题我们的主要设计方案是:根据不同的奖金录入,对常录入的,和不常录入的信息进行分类,将常录入的放在醒目的地方,使用户可以清楚的知道自己该录入的数据。对用户的操作进行一定的限制,如对数据的范围限制,保证数据的基本无误,也防范用户的疏忽录入导致奖金被打回。对每个过程进行提示功能,对于复杂的录入,采用以流程性的操作,只要用户按照设计好的流程就可以完成录入工作。

操作如何简易化,为了适应不同的用户群,同时又使操作更加简单化。在设计我们的主要是采用的原则是少录入一个数据就少录入一个数据。同时为适应不同用户需求,在界面设计上你既可以用鼠标又可以采用键盘。

在后台保存数据的完整性和原始性

   为了保证最终的奖金信息的准确性和每条奖金都有据可依,我们必须保存数据的完整性,同时保证数据的范围。比如:数据小数位要比最终计算的奖金位数大。

3.5.3奖金统计模块

奖金统计也是本系统中的一个重要的一块,为了更好的反映全校、各系、个人的奖金信息,统计是非常必要的。该模块我们的设计思想是尽可能的满足不同用户的需求,因此系统统计的项目也非常之多。我们总的将模块的分为有两大块:

一是按全校、系别和个人对不同时间段进行统计,统计的分类有9种,分别是:

   统计出单个老师单个月的奖金信息。

   统计单个老师一个学期的奖金信息。

   统计单个老师一个学年的奖金信息。

   统计全校单个月的奖金信息。

   统计全校一个学期的奖金信息。

   统计全校一个学年的奖金信息。

   统计一个系的单个月的奖金信息。

   统计一个系一个学期的奖金信息。

   统计一个系一个学年的奖金信息。

 

二是按职务、职称、学历和班主任在不同时间段进行统计,该统计包括有6种:

   在职务、职称、学历和班主任条件下:

   统计全校单个月的奖金信息。

   统计全校一个学期的奖金信息。

   统计全校一个学年的奖金信息。

   统计单个系单个月的奖金信息。

   统计单个系一个学期的奖金信息。

   统计单个系一个学年的奖金信息

3.5.4奖金审核模块

奖金审核虽然在功能实现不复杂,但却是系统奖金管理中的一个重要的一环。只要保证奖金审核的实现的正确性,才能保证最终教师奖金的正确。因此我们设计了,两套审核。只要通过了两套审核的奖金才最终有效。首先是系秘书对教师录入周记录进行审核,没有通过审核的奖金信息将被打回,重新录入。经过周审核后要还要通过系主任的月审核。该模块设计主要是保证审核的正确性、安全性。只有审核权限的人才可以对普通教师的奖金进行审核,一般的用户是不能看到此功能的。

3.5.5奖金查询模块

奖金查询模块的主要功能是查询自己已录入的周记录的和月记录的奖金总数,以及这些奖金信息的是否通过审核的状态,通过此可以让用户知道自己填写的奖金信息是否通过审核和总的奖金数。

3.5.6个人信息修改模块

个人信息修改模块主要功能是用户给用户修改自己的联系方式,教师名。

3.5.7教师管理模块

教师管理模块主要功能是用来设定和修改各系的系别管理。系别管理模块主要功能是用来设定和修改各的系的系主任和系秘书,只有这两种身份的用户才可以审核教师的奖金信息

 

3.5.8账号管理模块

账号管理模块主要用来管理用户账号,教师的初始账号和密码为教师的教师号和密码。如果用户可以重新更改账号密码,当用户忘记密码后可以,可以让管理员重新恢复到初始化时。
3.5.9比例设计模块

比例设计模块主要功能用来设置奖金计算的各种比例,包括有:教案转课时换算比例,课时大专转中专换算比例,教案大专转中专换算比例,超课时计算比例,职称比例,职务比例,合班比例,专升本上课比例,毕业指导比例,课类型转换比例,监考补贴比例,巡考补贴比例,阅卷补贴比例,出题补贴比例,选修课比例,班主任补贴比例,通讯费比例。只有管理员才可以更改比例,而普通用户没有更改比例的权限。

3.5.10软件设置模块

软件设置模块主要功能是包括设置服务器的IP,连接时间,软件启动时显示的窗口,窗口是否显示在最上面,是否最小化隐藏到任务栏上,是否自动展开功能列表,自动检测软件版本。

3.5.11密码修改模块

密码修改模块是用来修改提供给用户修改自己账号的密码。

3.5.12留言模块

留言模块主要功能是查看留言和发表留言。

4.系统实施

4.1界面设计及功能实现

下面结合界面的设计来简述系统主要功能的实现。由于篇幅有限,只选择了系统中几个关键模块讲述了其中设计实现中的关键问题。

4.1.1主框架

界面设计

系统的采用对话框主框架,在主框架的右边中嵌入对话框当作子窗口,在主框架的左边用树形控件来系做为系统功能菜单的导航,在主框架的上面创建一个flash。根据响应树形控件的选择节点的消息来显示对应的子窗口。采用对话框操作起来更方面,可以直接在上面拖控件和可视化的布局,而采用树形控件更好显示系统的功能列表,并按级别显示,同时可以设置菜单的自动展开和收缩功能。将每个单独的模块建立一个子窗口,在子窗口里实现每个模块的功能,可使模块更独立。而只需在主框架结构中动态的创建和显示出子窗口;

主框架的大小为535*365px,树形控件的大小为110*270px,子窗口的大小为388*163pxflash控件的大小为535*50px

如下图4-1是系统录入奖金信息的窗口,上面是一个flash,左边是一个树形控件,右边是输入奖金信息的子窗口。


4-1 奖金录入界面

功能实现

主框架要实现:创建树形控件并根据用户类型生成树形控件。响应树形控件的TVN_SELCHANGED根据选择的节点显示子窗口(详细见下文的“窗口的嵌套”)主框架的标题栏还要显示用户的信息,用到了SetWindowText(title)设置标题。还有一个要控制的是主框架初始化的显示的窗口,这个是读取软件软件设置的配置文件。

在新建对话框当作子窗口时要对话框的Style属性的值设为“Child,Border属性设为“None,而作为主框架的对话框架可以按照自动生成的样式。

在主框架的对话框中拖一个树形控件,而树形控件的节点要根据用户的类型来动态创建。并设置处理树形控件的TVN_SELCHANGED消息,根据用户选择的不同来动态创建子窗口并显示,再创建一个新的子窗口时要销毁前一个已显示的窗口,即每时只有一个子窗口了,而不是当系统启动都将所有的子窗口都创建。

4.1.2奖金录入

①界面设计

如上图4-1是奖金录入界面,由于项目繁多,为了不使人眼花缭乱,用采用Group Box对相同的项目进行分组,将最常录入的项目放在最醒目的地方,如课时数和教案数是每个教师必输入的。由于该界面的录入必须是原始数据而不是计算后的分数,但对于某些内容如果都放在一个界面,显然显得很乱。因此对于某些要项目,采用弹出另一个计算对话框用于用户录入原始数据,再将最终计算结果传递过来。如:合班课和阅卷,出题补贴得计算。同时在录入数据时都采用编辑框(Edit Box)加调节控件(Spin)相结合,这样用户既可以键盘操作又可以用鼠标来调节Spin来录入数据。

功能实现

当教师第一次录入奖金时会让用户选择开始录入的周,以后每次在用户在这周上递加1

当用户第一次录入数据时会提示要求用户选择录入奖金的开始时间,如下图4-2


4-2 选择初始时间界面

点击“日期确认”,会将选中的时间传给录入对话框。

在录入对话框中点击“提交”,会将录入的各项值保存到数据库,统计还要根据奖金计算的比例计算周奖金总数。

4.1.3奖金审核

界面设计

如下图4-3的奖金审核的界面,该界面主要是用来显示教师录入的奖金信息,系主任和系秘书根据这里的数据判断教师录入的是否有误。


4-3 奖金审核界面

功能实现

采用CListCtrl从数据库的月记录表(Month)中读取教师已录入但未通过审核的奖金信息。根据CListCtrl的消息NM_CLICK获取当前选中的记录行,int nItem=m_list.GetNextItem(-1,LVNI_SELECTED);并将选中的值传递到上面的编辑框中。

点击“通过”,根据数据将数据库中的标识是否通过字段置为1.

4.1.4奖金统计

界面设计

如下图4-4是供用户选择查询条件的界面,整个是以下拉控件(Combo Box 控件)来让用户选择,用户选择不同的查询条件,点查询后就可以如果有满足条件的结果就会显示弹出如下图4-5的对话框(类名:CSearchRsDlg),并在列表中显示查询中结果。


4-4 奖金统计界面

4-5 显示统计结果界面

功能实现

该模块要实现又三个方面:

一是下拉控件(Combo Box)联动获取数据库中的数据,如当学年改变时要获取对应学年的学期,当学期改变时要获取对应学期的月;当系别改变时要对应获取对应系的教师。要能这样实现是处理下拉控件的CBN_SELCHANGE消息。

二是传递统计置给显示对话框(CSearchRsDlg

由于统计的种类很多,因此要传递以下值以标识统计的种类:统计的Sql语句(strSql),显示的标题(strTitle),查询的月(strMonth),查询的学期(strTerm),查询的学年(strYear),查询的大种类(0 or 1,大种类中的类别(SearchFlag)。

三是数据的显示,由于统计的数据有些没法直接同时在CListCtrl上显示出来,因为CListCtrl的标题也是从数据库中读取出来的。为了解决这种问题,采用了将数据先保存在链表中的,并同时设置列标题名(如: m_ListCtrl.InsertColumn(0,str,LVCFMT_LEFT,110),再根据标题名插入链表中的数据(如:m_ListCtrl.SetItemText(0,1,str))。

4.1.5比例设置

界面设计

为了模块的独立性,将不同比例设计在不同界面中。同时为了界面的布局和适应整个系统的布局,在比例界面上都加了一段比例设置说明。如下图4-6是职称比例设置的界面


4-6 职称比例设置界面

功能实现

多数比例设置如上图的职务比例设置,有添加,修改,删除功能,但如教案转换比例,课时转换比例就只能修改。每个比例设置都是对数据库中比例设计表的操作,设置大致类似实现也简单在此不再一一讲述。

 

4.1.6月记录的生成

月记录是根据周记录在程序内部生成的,按学期为一个轮回,学期的第1-4周为第一个月,第58周为第二个月依次类推。当教师的录入周记录就根据周来判断所属的月,如果该月在月记录表不存在就插入一条月记录,否则直接在月记录表中直接更新这周的奖金总数到月记录表中。在此系统中目前还在代码中生成月记录,如能在数据库中用触发器生成效率会更高。

4.2主要算法和代码的实现和分析

下面是对系统中用到的主要的算法的介绍和分析。

4.2.1窗口的嵌套

窗口的嵌套是在主对话框中嵌入一个另一个对话框,使只看起来像是在一个对话框上。本系统中就是采用此方法建立的系统框架

创建的关键步骤如下:

建立两个对话框后将作为子对话框CChildDlg Style属性的值设为“Child,Border属性设为“None

在作为主对话框中创建子对话框CChildDlg *dlg;

dlg->Create(IDD_DIALOG_Child,this);//IDD_DIALOG_Child子窗口ID

移动子窗口在父窗口上的位置

 dlg->MoveWindow(rect);//   rect CRect对象是最终子窗口所在的位置

显示出子窗口

dlg.ShowWindow(SW_SHOW);

4.2.2 Flash的创建

VC6.0中选择Project>>Add To Project>>Components and Controls Gallery>>Registered ActiveX Controls中的Shockwave Flash Object,插入后即在工程添加shockwaveflash.cppshockwaveflash.h两个文件。

创建flash控件,可以直接在控件工具栏上拖一个Shockwaveflash Flash Object控件到对话框。也
可按以下代码创建

CShockwaveFlash m_flashCtrl;

m_flashCtrl.Create("Flash",WS_VISIBLE,rc,this,ID,NULL,FALSE,NULL);

设置显示的Flash文件路径,该路径既可以为本地路径,也可为网络路径

M_flashCtrl. SetMovie("D:\\flash.swf");

M_flashCtrl. SetMovie("http://www.xxx.com//flash.swf");

4.2.3给树形控件加背景图片

为了使界面更美观,给系统左边的树形控件加了一个背景图片,给树形控件加载背景图片的方法如下:

新建一个类CMyTreeCtrlCTreeCtrl派生

添加CBitmap m_bitmap;属性

OnPaint()中重画树形控件背景,如下代码:

CDC memdc;

     memdc.CreateCompatibleDC(&dc);  

     CBitmap bitmap;

     bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());

     memdc.SelectObject( &bitmap );

     CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);

     CDC maskdc;

     maskdc.CreateCompatibleDC(&dc);

     CBitmap maskbitmap;

     maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL);

     maskdc.SelectObject( &maskbitmap );

     maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), &memdc,

         rcclient.left, rcclient.top, SRCCOPY);

     CBrush brush;

     brush.CreatePatternBrush(&m_bitmap);

     dc.FillRect(rcclient, &brush);  

    

     memdc.SetBkColor(RGB(0,0,0));         

     memdc.SetTextColor(RGB(255,255,255)); 

     memdc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), &maskdc, rcclient.left, rcclient.top, SRCAND);

     dc.SetBkColor(RGB(255,255,255));

     dc.SetTextColor(RGB(0,0,0));

     dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), &maskdc, rcclient.left, rcclient.top, SRCAND);

     dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), &memdc,

                       rcclient.left, rcclient.top,SRCPAINT);

     brush.DeleteObject();

 

处理树形控件的TVN_ITEMEXPANDINGTVN_ITEMEXPANDED消息响应

TVN_ITEMEXPANDING(节点展开时)消息响应中防止重画闪屏SetRedraw(FALSE);

TVN_ITEMEXPANDED(节点展开后)消息响应中强制重画更新背景Invalidate();SetRedraw (TRUE);

定义SetBKImage(UINT nIDResource)方法设置定义为背景的图片资源,实现如下:

if( m_bitmap.m_hObject != NULL )

         m_bitmap.DeleteObject();

if (!m_bitmap.LoadBitmap(nIDResource))

     {

         return FALSE;

     }

将树形控件改为从CMyTreeCtrl派生

CMyTreeCtrl的方法SetBKImage设置背景

M_tree.SetBKImage(IDB_BITMAP1);

4.2.4加载XP样式皮肤

本系统采用的XP样式的皮肤,由于XP样式皮肤只能在Windows XP下才成现出来,因此为了使系统在其它Windows版本下也能显示,有到了两种加载皮肤的方法

种是加载XP 样式Dll文件:

    typedef BOOL  (WINAPI *pClassXP)(HWND,BOOL);

         HINSTANCE hInst=NULL;

         hInst=::LoadLibrary("ClassXP.dll");

         if (hInst)

         {

              pClassXP pFunc= (pClassXP)GetProcAddress (hInst,"ClassXP");

              pFunc(NULL,TRUE);     

         }

种将下文件复制到记事本中保存到你的程序的可执行文件(如为:my.exe,保存的文件名为:my.exe. manifest.用这种方法只能在Windows XP在显示XP风格

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<assemblyIdentity name="Microsoft.Windows.Shell.ClassXP" processorArchitecture="x86"

    version="1.0.0.0" type="win32"/>

<description>ClassXP</description>

<dependency> <dependentAssembly> <assemblyIdentity

 type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0"

processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"

 /> </dependentAssembly>

</dependency> </assembly>

-------------------------------------------------------------------------------------------

也可以把该文件编译到程序中这样目录中就不用要这个文件(my.exe.manifest)方法如下:用记事本打开工程下的资源文件(如my.rc)在最后一行加入 1      24     "res\\XpStyle.manifest"

XpStyle.mainfest为上面一段代码保存后的文件。本系统中就是把该文件编译到系统中,这样在可执行程序下就不用有个这种文件。

 

4.2.5封装ADO对象

本系统才采用了ADO技术操作数据库,为了调用的方便,对ADO对象进行了封装,每次使用只需定义一个类的实例。实现如下:

初始化COM环境,引入ADO动态链接库。

CtheApp::InitInstance()里加:ComInitialize(NULL);

 在使用ADO技术时,需要在StadAfx.h使用预处理命令#import引入一个ADO动态链接库msado15.dll[7]

增加封装ADO对象的类,名为:CMyADO, 包含StdAfx.h头文件

类定义如下:

class CMyADO 

{

public:

     CMyADO();

     CMyADO(CString strIp,int ConnTime);//重载构造函数

     virtual ~CMyADO();

public:

     void CloseConn();//关闭连接

     BOOL ExeSql(CString strSql);//执行SQl语句

     _RecordsetPtr  m_pAdoRs;

CString m_strIp;//数据库的IP

int m_ConnTime;//连接时间

     CString m_UserName;//连接数据的Use ID

     CString m_Pswd;//连接数据的密码

private:

     _ConnectionPtr m_pAdoConn;

};

类的实现

CMyADO::CMyADO()

{

     int ip1,ip2,ip3,ip4;

     ip1=GetPrivateProfileInt(theApp.m_tno,"ip1",192,SET_FILE);

     ip2=GetPrivateProfileInt(theApp.m_tno,"ip2",168,SET_FILE);

     ip3=GetPrivateProfileInt(theApp.m_tno,"ip3",1,SET_FILE);

     ip4=GetPrivateProfileInt(theApp.m_tno,"ip4",9,SET_FILE);

     m_strIp.Format("%d.%d.%d.%d",ip1,ip2,ip3,ip4);

     m_ConnTime=5;

     m_UserName="sa";

     m_Pswd="";

}

CMyADO::CMyADO(CString strIp,int ConnTime)

{

     m_strIp=strIp;

     m_ConnTime=ConnTime;

}

CMyADO::~CMyADO()

{

     if (m_pAdoConn->State==adStateOpen)

     {

         m_pAdoConn->Close();

     }

     m_pAdoConn=NULL;

     if (m_pAdoRs->State==adStateOpen)

     {

         m_pAdoRs->Close();

     }

     m_pAdoRs=NULL;

}

BOOL CMyADO::ExeSql(CString strSql)

{

     HRESULT hr;   CString str;

     try

     {

         hr=m_pAdoConn.CreateInstance("ADODB.Connection"); 

         str.Format("Provider=SQLOLEDB;Data Source=%s;Initial Catalog=BONUS;User ID=%s;Password=%s;",m_strIp,m_UserName,m_Pswd);

         if (SUCCEEDED(hr))

         {

              m_pAdoConn->ConnectionTimeout=m_ConnTime;

              m_pAdoConn->Open((_bstr_t)str,"","",adModeUnknown);

         }

         else

         {

              AfxMessageBox("您和服务器的连接已经断开,请检查网络是否联通,然后重试");

              return FALSE;

         }

     }

     catch (_com_error e)

     {

         CString temp;

         temp.Format(_T("错误信息:%s"),e.ErrorMessage());

         temp="您和服务器的连接已经断开,请检查网络是否联通,然后重试";

         AfxMessageBox(temp);

         return FALSE;

     }

     if (m_pAdoRs!=NULL)

     {

         if (m_pAdoRs->State==adStateOpen)

         {

              m_pAdoRs->Close();

         }

     }

     try

     {

         m_pAdoRs.CreateInstance("ADODB.Recordset");

         m_pAdoRs->Open((_variant_t)strSql,m_pAdoConn.GetInterfacePtr(), adOpenStatic, adLockOptimistic, adCmdText);

         //MessageBox("成功打开表");

     }

     catch(_com_error e)///捕捉异常

     {

         CString temp;

         temp.Format(_T("打开数据库错误:%s"),e.ErrorMessage());

         AfxMessageBox(temp);

         return FALSE;

     }    return TRUE;

}

void CMyADO::CloseConn()

{

     if (m_pAdoConn->State==adStateOpen)

     {

         m_pAdoConn->Close();

     }

     if (m_pAdoRs->State==adStateOpen)

     {

         m_pAdoRs->Close();

     }

}

类的调用

在使用时只需定义的类的实例CMyADO m_Ado=new CMyADO();

用定义的实例m_Ado调用公用方法ExeSql()

 

4.2.6按需读取数据

按需读取数据就是只读取需要更新的数据,而已读取的数据不重复读取[8]。虽然C/S模式的系统不比B/S的系统讲求内容显示速度。但如能C/S模式中也能考虑这些问题将使系统的效率有很大的提高。

VC中大家读取数据到CListCtrl中往往时,将这段代码封装到一个函数(如:UpdateList())中。当数据改变时只需重新调用这个函数。这样写的确没有问题也方便,但是我们只增加了一条数据或只修改了列表中的一条数据,而不需要重新整各刷新列表中的数据,而只需在列表中增加一条数据或修改一条数据。

在本系统中的大部分都考虑了系统的效率文件,在修改和删除只对应的修改了列表控件上的一条数据,或只删除了一条数据。这样就不会感觉整个列表都被刷新了,同时也节约了网络资源,不用重新读取全部数据

4.2.7SQL Server数据库作为服务器

SQL Server 数据库作为服务器,采用ADO连接数据。

_ConnectionPtr m_pAdoConn;//定义_ConnectionPtr对象

m_pAdoConn.CreateInstance("ADODB.Connection");//创建实例

strConn.Format("Provider=SQLOLEDB;Data Source=%s;Initial Catalog=BONUS;User ID=sa;Password=;",strIp);//设置字符串,strIp为服务器IP

m_pAdoConn->Open((_bstr_t)strConn,"","",adModeUnknown);

采用此种方法非常简单使系统成为C/S模式

4.2.8窗口前置

将窗口置于最前方是改变窗口Z次序的(Z order[9])位置

代码如下:

::SetWindowPos(AfxGetMainWnd()->m_hWnd,HWND_TOPMOST,-1,-1,-1,-1,SWP_NOMOVE|SWP_NOSIZE);

关键参数: HWND_TOPMOST

取消窗口前置只需HWND_TOPMOST 该为HWND_NOTOPMOST

4.2.9链表的使用

链表是由指针连起来的一系列的节点,链表可以动态的延伸,插入和删除节点效率更高 [10]。在MFC中对链表进行封装,使用更方便。在本系统的奖金统计中用到了链表,

使用链表的方法如下:

#include <afxtempl.h>

typedef CTypedPtrList<CPtrList, CMyClass*> CDataList;//CMyClass定义的类

定义实例:CDataList m_DataList;

4.3系统测试

系统测试是对系统的计划、系统设计、软件编码进行查错和纠错的活动,包括代码的执行活动与人工活动)。测试的目的是找出软件设计开发全周期中的各个阶段的错误,以便分析错误的性质与位置而加以纠正。由于篇幅有限本文大致从本系统测试过程中的关键问题进行讲述。

4.3.1测试计划和任务

测试主要包括单元测试、集成测试和系统测试。

单元测试:测试主要任务是测试模块间接口、模块的功能是否按照需求完成、模块内部数据是否正确、数据类型不相容时是否溢出、计算的精确度是否在允许的范围内等。

集成测试:测试的主要任务是测试模块间的通讯是否正确、用户类型不同登陆的权限是否正确等。

系统测试:测试的主要任务是测试数据的初始化、系统启动、连接远程数据库、系统安全、异常频度系、系统强度、性能是否达到规格等。

4.3.2测试过程

下文摘取了系统实际测试中的一些关键模块和文件

奖金输入

测试的主要问题:

l         数量能否正确录入数据库。

l         有无有效的防止用户录入错误,如防止非数字的录入。

l         是否有清楚的让用户知道改录入的数据。

l         能否保存数据的精确度在范围之内。

l         能否准确的计算出总奖金

l         能否重新录入出错的奖金

l         能否提供录入的奖金项目都有。

l         奖金录入的数据是否有限制。

l         是否按照需求分析实现的。

测试的数据:

测试的主要数据来自现有的奖金计算文件Excel

奖金统计

测试的主要问题:

l         能否正确的在下拉列表中显示出已有奖金的时间。

l         能否正确的使下拉列表连动。

l         能否正确的统计。

l         能否正确的导出数据到Excel

l         在没有统计数据时是否给提示。

测试的数据是根据数据中的数据选择特定的数据,人工计算和统计的结果对比。

奖金审核

l         能否在安全权限上有限制。

l         能否实现需求。

比例设置

测试的主要问题:

l         数据的精确度是否在允许的范围内。

l         是否能正确的保存在数据库中。

l         更改比例权限是否有限制。

l         是否能实现需求。

l         是否改变后提示后提示用户。

测试的数据:

测试的主要是现有的奖金管理文件。

软件设置

测试的主要问题:

l         能否有效的设置软件,设置后是否马上有效还是重启后生效。

l         能否实现需求中要求的设置。

根据设置查看系统在软件设置后是否正确有效。

数据库连接

l         能否实现远程数据库的连接。

l         在网络出现问题时是否有效的提示用户。

4.3.3测试结果

根据测试系统在功能上完成了需求,在奖金的计算结果在大致在运行的范围内,由于篇幅有限不能一一列出测试的结果。根据测试的结果和发现的问题更进一步完善了系统。

5.结束语

本文从结合本人在高校奖金管理系统的开发实践,描述了高校奖金管理系统开发设计中的重要问题、按照软件项目的开发流程,是对本次项目开发中关键问题,设计思想和实现方法做了一个概述性的阐述。

本系统实现预期的需求目标了,但在某些地方还需要进一步改进和维护。通过此次开发实践,使我受益甚多。软件项目开发的需求分析和设计的好坏直接关系到最终的产品的生亡。软件项目是一门综合的学问,要用到个方面的所学,同时还善于和用户沟通了解用户需求。在软件项目开发中,文档和代码的规范也尤为重要。这些都是我从中感触最深的。

参考文献

 

[1](美)David Simon,周瑜萍等.Visual C++编程宝典》.电子工业出版社,2006.

 

[2] 王瑞,于速,张雨.Visual C++ 数据库系统开发完全手册》.人民邮电出版社.2006.

[3] Tom Pender.UML Bible.Wiley Publishing,Inc,2003

[4] 赵松涛 《深入浅出SQL Server 2000系统管理与应用开发》.人民邮电出版社,2006.

[5] ()艾伦(EliensA.) 著,袁兆山 等译.《面向对象软件开发原理》.2003

[6] 李大友,陈明.《实用软件工程基础》.清华大学出版社.2002.

[7] 塞奎春,申红,苗春义.Visual C++ 信息系统开发实例精选》.机工业出版社

[8] 施伟伟.征服Ajax--Web 2.0快速入门与项目实践(.net)》.人民邮电出版社,2006.

[9] 孙鑫,余安.VC++深入详解》. 电子工业出版社,2006.

[10] Joel Adams ,Larry Nyhoff.C++:AN INTRODUCTION TO COMPUTING THIRD EDITION. Peason Education Inc ,2003

 


free web counter