言
课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的、必不可少的一个教学环节。通常,课程设计中的问题比平时的习题复杂得多,也更接近实际。课程设计着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力。另一方面,使书上的知识变活,起到深化理解和灵活应用教学内容的目的。平时的习题局限于一个和二个知识点,而课程设计题是软件设计的综合训练,包括问题分析,总体结构设计,用户界面设计、程序设计、基本技能和技巧,以及一整套软件工作规范的训练和科学作风的培养。我们这组选的课题是工资管理系统的设计与开发。从接到任务书开始,我们首先完成了系统的需求分析与概要设计,在完成这些任务时,我们深感理论与实践的结合的是需要一个过程。从个人分工到整个系统分析,从设计到测试之所以能顺利完成是和大家的努力分不开的。虽然还有一些不足之处,但是我们还是从中获益不少。
下面简要介绍一下我们课题组的分工,我们这组的分工其实借鉴了Shari Lawrence Pfleeger 和Joanne 合着的 SOFTWARE ENGINEERING Theory and Practice (高等教育出版社第三版影印版)中的一些理论,这些知识可以参考此书的第25页中关于“开发团队的角色分工”一节。根据分工的细化和部分重叠原则,我们组的具体分如下:
(1)项目管理 : 王培
(2)需求分析 : 钟耀明、贺纯 (3)概要设计 : 贺纯、赵亦娴
(4)详细设计 : 赵亦娴、王培、钟耀明、杨安、陈华、贺纯 (5)程序编码 : 王培、陈华 (6)系统测试 : 陈华、杨安
我的主要任务是概要设计和详细设计 2需求分析
任务概述
现代企业基本上都引进了计算机软件对公司业务进行管理,这样做有很多优点,一是提高了工作的效率,同时也减少了手工操作的错误以及人员的开支。本课题开发的工资管理系统正是基于这样的目的实现的,系统完成的主要功能是对员工工资的管理,同时还包括对员工信息、部门信息以及附属于员工、部门的职称和职务信息的管理。系统主要采用事务型数据库设计,但对于员工工资的信息,系统能够保留其相应的历史记录,包括员工的请假信息,出差信息以及工资结算信息等。本系统面向员工和管理人员同时开放,普通用户可以进行查询以及对个人相关信息的修改等操作,管理账户则拥有系统的全部功能。系统不允许非经认证通过的用户使用系统。系统采用语言开发,系统的数据使用SQL数据库进行管理。 2.2 功能需求分析
(1)系统能够维护员工的基本信息,部门、职务、职称以及工资记录等信息。 (2)系统应该能记录员工的每一个职称信息,并授予相应的职称,系统在计算员工工资的时候选取职称对应的最高职称津贴。
(3)工资表应当由系统自动生成。系统负责员工的工资表以及员工工资的历史记录及记录员工的请假信息和出差信息等意外情况。
(4)系统可以给管理员提供权限增加删除修改系统用户以及其它实体信息,系统的部分权限不能下放给普通用户以保证系统的安全性以及数据的正确性。 外部接口需求分析
系统人机交互界面为半屏幕大小,采用上下左右居中方式显示,系统分辩率默认设置为1280*800,实际的界面大小由具体的屏幕决定。主界面包括标题栏,菜单栏,快捷工作区,帮助信息区(默认是隐藏的)。每一个菜单对应一个键盘快捷键区。 性能需求分析
系统在主频,内存512MB,总线频率667MHZ的硬件平台上运行时,系统的响应时间、更新处理时间、数据转换与传输时间、运行时间均能达到毫秒级。系统支持用户并发操作,事务采用可串行化隔离级别,防止在读写过程中产生的丢失修改、读脏数据、不可重复读等一系列由并发操作带来的不一致问题。系统的运行主存控制在1024KB以内,响应时间控制在1000ms以内,系统对数据的存储空间取决于数据库系统表空间的约束限制。
软件属性需求分析
系统必须保证所有操作结果以及存储数据的正确性,对于用户的非法操作,系统必须能够提出告警信息,对于用户的错误操作,系统能够提供错误信息以及错误源。在数据库操作上的异常,系统也应捕捉到并提供界面化的提示信息,对于可能会产生错误的操作,应当能够防范。另外系统必须提供一定的安全保密性,一些保密信息只针对特定的用户提供。它人员无法访问。软件必须为中文操作界面,并且所有的中文功能菜单项描述须与其实际对应的功能相一致,不能存在功能不足或者功能不对的情况,软件采用面向对象技术架构,遵循代码编写规范,提供适当的代码注释,尽可能地采用可复用技术,提高软件的可维护性。 3 概要设计 系统设计总体思想
当工资管理系统处理的事务主要有工资管理,员工信息管理,部门信息管理,职务信息管理,职称信息管理。职务和职称以及部门信息管理主要服务于工资管理和员工信息管理,系统接收的输入项目有员工信息,部门信息,职务信息,职称信息,请假信息,出差信息等。系统能够接受用户的请求,显示相应的查询信息,增加、删除、修改相应的合法的信息。
图3.1.1 工资管理系统HIPO图
图3.1.1是工资管理系统的HIPO图,上图主要说明了系统的各个主要功能以及各功能模块之间的层次关系。上图的基本框架也是整个系统界面的基要框架。系统的人机交互采用图形化用户界面,考虑到系统的平台无关性,系统由JAVA语言实现,系统的界面元素也是采用了JAVA的JFC图形类库。系统可以在安装了JAVA运行环境的平台上运行。系统从登录界面开始,要求验证用户信息,用户通过验证后,进入系统主界面。主界面提供了一个菜单框架,可以通过各个菜单类的一个实例来加载菜单,这一步不是由主界面完成的,而是由所需要被加载的类完成的,但需要主界面类去生成这些菜单英的实例。系统加载的功能主要包括系统管理,用户管理,工资管理,部门管理,职务管理,职称管理以及适当的帮助信息。系统管理主要向用户提供用户更改密码的操作以及退出程序的功能。用户管理允许管理员新建一个员工信息,比如当公司新增加了一个员工时,系统为该员工生成相应的工资关系,但新建这个员工的信息则是第一环节,当然如果公司离任了一名员工时,此员工与公司的工资关系已解除,则没有必要保留该员工的信息,系统应向管理员提供删除该员工的功能,同时删除与该员工相关的所有其它信息。公司所在的员工可能有部分具有相应的职称,考虑到职
称的种类繁多,系统只添加本公司员工所拥有的职称的一个集合,而不考虑外界的因素,因此系统提供了增加、删除、修改、查询等对职称的相关操作。例如,当公司一员工拿到高级职称后,管理员首选应该查看系统是否记录了相应职称的信息,如果有,则直接将该职称信息添加到员工信息中去,如果没有,则应当先增加这一职称信息,再执行上述操作。另外在删除一个职称的时候,系统要求必须没有员工拥有此职称,否则系统不能删除,如果确实要删除,则只能先删除拥有此职称的所有员工或者撤销拥有此职称的所有员工的此职称。 系统功能模块设计
图3.2.1 系统功能模块设计
系统数据库设计
通过对工资管理系统的数据分析并根据业务之间的联系,我们可以得出与系统相工资管理系统的数据据库管理模式用语义描述如下:
(1)每一个员工只能属于一个部门,担任一个职务,但是可以拥有多个职称. (2)每个部门可以有多名员工,有不同的职务.
(3)每个职务可以由多名员工担任,可以在相同的部门,也可以在不同的部门. (4)每个职称可以授予不同的员工.
(5)每个员工每个月都会有一份工资记录,并且会有一份历史工资记录.
(6)员工每个月可以请假多次或者出差多次.但是要扣除相应的工资或者获得相应的
关的实体有:员工、部门、职务、职称、请假信息、出差信息、工资。
补助.每个员工都有一分历史请假记录和历史出差记录。 综合上述语义,可以得出系统的ER图如图3.3.1所示:
3.3.1 工资管理系统ER图
根据实体之间的联系,以及分析实体的属性,得出了工资管理系统中各个实体的属性,相关属性列表见表3.3.1。
表3.3.1 工资管理模型的相关属性列表
实体或联员工 部门 职务 职称 属性 员工编号、姓名、性别、部门号、职务 部门编号、名称、人数、电话 职务编号、名称、基本工资 职称编号、名称、职称津贴 出差信息 出差编号、员工编号、天数、出差年份、出差月份、出差补员工职称员工编号、职称编号 请假信息 请假编号、员工编号、天数、年、月、扣除工资、请假原由 工资 工资编号、员工编号、工资所属年月、基本工资、扣除工资、出差补助、岗位工资、职称津贴、工资总额 说明:加粗部分为主键,加底线部分为外键
图3.3.2 实体及其相关属性图
4 详细设计 数据结构设计
4.1.1 数据库表结构设计
Employee——员工信息表 字段数据类型 名 约束 名称 明 说empno number(6) 主键 员工编号 员工姓名 性别 ename varchar2(20) not null sex varchar2(4) not null 外键department(deptno) 外键duty(dutyno) Department--部门信息表 字段名 deptno deptname empnum tel deptno number(6) dutyno number(6) 部门编号 职务编号 数据类型 number(6) varchar2(20) number number 约束 主键 not null 名称 部门编号 部门名 部门人数 电话 说明 Duty--职务信息表 说字段名 数据类型 约束 名称 明 dutyno number(6) 主键 not null default(0), dutypay number check(dutypay>=0) Title--职称信息表 说字段名 数据类型 约束 名称 明 titleno number(6) 主键 职称编号 职务基本工资 职务编号 职务名 dutyname varchar(20) titlename varchar2(20) not null default(0), titlepay number check(titlepay>=0) TitledEmployee--员工职称联系表 字段名 empno 数据类型 number(6) 约束 组合主键, 外键employee(empno) 职称名 职称津贴 名称 员工编号 职称编号 年 说明 titleno number(6) year number(4) 记录职称授予month number between 1 and 12 月 时间 Leave--员工请假信息表 说字段名 数据类型 约束 名称 明 leaveno empno leavedays leaveyear number(6) number(6) number number(4) 主键 外键employee(empno) not null not null not null not null 请假编号 请假员工 请假天数 请假年份 请假月份 扣除工资 请假原因 leavemonth number deduction reason number varchar(60) BusinessTravel--出差信息表 字段名 数据类型 约束 名称 说明 travelno empno traveldays travelyear travelmonth travelpay number(6) primary key number(6) 外键employee(empno) number not null 出差编号 员工编号 出差天数 出差年份 出差月份 出差补助 number(4) not null number number not null not null Reward--奖励信息表 说字段名 数据类型 约束 名称 明 rewardno empno rewardyear number(6) number(6) number(4) primary key 外键employee(empno) not null not null 奖励编号 员工编号 奖励年份 奖励月份 奖励金额 奖励原由 rewardmonth number rewardpay reason number varchar(60) Penalty--罚金信息表 说字段名 数据类型 约束 名称 明 penaltyno empno number(6) number(6) primary key 外键employee(empno) not null 罚金编号 员工编号 罚金年份 penaltyyear number(4) penaltmonth number penaltynum reason not null 罚金月份 罚金额度 罚金原由 number varchar(60) Salary--职工工资信息表 说字段名 数据类型 约束 名称 明 salno empno payyear paymonth basepay deduction travelpay dutypay titlepay rewardpay penaltynum totalpay number(6) number(6) number(4) number number number number number number number number number primary key 外键employee(empno) 工资编号 员工编号 工资年份 工资月份 基本工资 请假扣除金额 出差补助 职务工资 职称津贴 奖励金额 罚金 between 1 and 12 工资总额 4.1.2 程序数据结构设计 (1)ADT DepartmentBean {
数据对象:
D={deptNo,deptName,empNum,tel|deptNo,empNumt和tel均为整数,deptName为字
符串}
数据关系: 电话}
R2={ 基本操作: setDeptNo(int no):设置部门的部门号为no. getDeptNo ():返回部门的部门号。 setDeptName(String name):设置部门的部门名为name. getDeptName():返回部门的部门号. setEmpNum(int num):设置部门的员工人数为num. getEmpNum():返回部门的人数. setTel(int telephone):设置部门的电话号码为telephone. getTel():返回部门的电话号码。 }ADT DepartmentBean (2)ADT Jdbc { 数据对象: D={dbUrl,theUser,thePsw,c,stmt,rs|dbUrl提供数据库对象,theUser,thePsw指定用户名和密码,c与数据库建立一个连接,stmt声明一条SQL语句,rs保存执行SQL语句的结果集.} 数据关系: R1 Jdbc():加载数据库驱动,建立数据库连接. executeUpdate(String sql):执行SQL更新语句,成功返回TRUE,失败则返回FALSE. executeQuery(String sql):执行SQL查询语句,返回结果集rs. close():关闭与数据库的连接. }ADT Jdbc R1={ 模块功能详细设计 4.2.1 部门信息删除模块设计 (1)类图设计 图4.2.1.1 部门信息删除模块类图 以下对部分类的属性和方法的说明: DepartmentMenu类: 属性名称 deptMenu deptInqueryItem deptDeleteItem deptUpdateItem User DepartmentDelete类: 方法名称 isDeptExist() isDeptEmpty() executeDelete() 返回值类型 boolean boolean void 功能说明 判断输入的部门号是否存在 判断输入的部门号是否为空 执行删除操作 ShowAction 类:该类为内部类,是将各功能集成到系统的框架之中.ShowAction类的构造函数提供了一个命名菜单项的方法,主要功能引入了DepartMentDelete这个类到系统中。通过监听器ShowAction执行actionPerformed()方法,系统就应该可以产生期望的动作。 (2)界面设计 图4.2.1.2 界面设计 界面设计说明:该文本框为单行文本框,可以输入要删除的部门号,当系统监听到文本框中选项被确定,将会自动地将该部门信息从数据库中删除。 (3)核心代码 属性类型 JMenu JMenuItem JMenuItem JMenuItem UserBean 属性说明 顶层菜单项 部门信息查询菜单项 部门信息删除菜单项 部门信息更新菜单项 用户业务类 说明: 当点击各菜单项时,会弹出相应的操作界面。 public class DepartmentDelete { private static final long serialVersionUID = -853766L; public DepartmentDelete() { } private boolean isDeptExist(int deptno) { ResultSet rs; Jdbc conn=null; boolean flag = false; try { conn = new Jdbc(); rs = (\"select deptno from department \"); while()) { executeDelete(); if( deptno == (\"deptno\")) { flag = true; break; } } (); (); (); (); } catch (InstantiationException e1) { } catch (IllegalAccessException e1) { } catch (ClassNotFoundException e1) { } catch (SQLException e1) { } return flag; } public boolean isDeptEmpty(int deptno) { ResultSet rs; Jdbc conn=null; boolean flag = false; try { conn = new Jdbc(); rs = (\"select count(*) from employee where deptno=\"+deptno); while()) { if( (1) == 0) { flag = true; break; } } private void executeDelete() { String deptnoStr = (null,\"请输入待删除部门编号!\"); int deptno=0; boolean flag =true; try{ } (); (); (); (); } catch (InstantiationException e1) { } catch (IllegalAccessException e1) { } catch (ClassNotFoundException e1) { } catch (SQLException e1) { } return flag; deptno = (deptnoStr); }catch(Exception e){ flag=false; } if( isDeptExist(deptno) == true ) { if( isDeptEmpty(deptno) == false ){ } (null,\"部门中有员工存在,无法删除!\"); deptno=\"); else { Jdbc conn = null; int res=0; try { conn = new Jdbc(); PreparedStatement pstmt = \"delete from department where (1, deptno); res = (); if( res !=0 ) (null, \"成功删除部门\"+deptno); else (null, \"删除失败\"); } catch (InstantiationException e) { (); } catch (IllegalAccessException e) { (); } catch (ClassNotFoundException e) { (); } catch (SQLException e) { (); } } } else if(flag) (null, \"您输入的部门号不存在!\"); } 4.2.2 图4.2.1.2所示的类图就是一个增加新员工的实现过 程,DepartmentAdd类是一个继承自类的界面类,它提供了一个供录入员工信息的操作界面,所有录入的信息,则通过DepartmentBean类生成一个实例对象来保 存,departmentAdd类的构造函数负责调用createAddInterface()私有方法来构造出界面,以及初始化各控件中的数值,如generateDeptNo()是生成部门编号,部编号并不能由用户或者管理员确定,而是由系统查询数据库后,遵循唯一性原则生成出来的编号.这样做不仅避免用户管理编号的繁琐性,而且也增强了系统的安全性. 图4.2.2.1 部门信息的增加功能模块类图 以下部分类的属性和方法的说明: DepartmentMenu类: 属性名称 deptMenu deptInqueryItem deptDeleteItem deptUpdateItem User 属性类型 JMenu JMenuItem JMenuItem JMenuItem UserBean 属性说明 顶层菜单项 部门信息查询菜单项 部门信息删除菜单项 部门信息更新菜单项 参数传递 说明: 当点击各菜单项时,会弹出相应的操作界面。 Load Department方法是用来加载Departmentmenu类 。 DepartmentAdd类: 属性名称 deptNoText deptNameText deptTelText confirmButton cancelButton dept DepartmentAdd类: 方法名称 DepartmentAdd() 返回值类型 void 功能说明 是Departmentadd类的构属性类型 JTextFied JtextFied JTextFied JButton JButton DepartmentBean 属性说明 部门编号输入文本框 部门名称输入文本框 部门电话输入文本框 确定按钮 取消按钮 参数传递 造函数 InitDeptInfo() genertateDeptNo() StoreDepartment() void void void 初始化部门信息 产生部门编号 创建增加信息界面 将新的信息保存到数据库中 ShowAction 类:该类为内部类,是将各功能集成到系统的框中.ShowAction类的构造函数提供了一个命名菜单项的方法,主要功能是引入DepartMentDelete这个类到系统中。通过监听器ShowActionactionPerformed()方法,系统就应该可以产生期望的动作。监听器ConfirmAction和CancelAction这两个监听器实现的均是接口,系统通过监听器响应用户的保存或者取消操作,调用数据库类Jdbc来执行SQL存储语句实现与数据库的连接以及对数据库的增加信息操作。 (2)界面设计 图4.2.2.2 增加部门信息界面 界面说明:以上文本框都是单行文本框,可以输入部门编号,部门名称,部门电话,当系统监听到文本框中的内容被确定,将会新的部门信息保存到数据库中。 (3)核心代码 public class DepartmentAdd extends JFrame{ CreateAddInterface() void { (\"Add a new Department!\"); (WIDTH,HEIGHT); (null); (false); v Dimension scr=().getScreenSize(); Dimension frm=(); ((int)()())/2, (int)()())/2-50); createAddInterface(); generateDeptNo(); initDeptInfo(); } private void initDeptInfo() { } private void generateDeptNo() { ResultSet rs; Jdbc conn=null; int no = 102001; try { conn = new Jdbc(); rs = (\"select deptno from department order by deptno\"); while()) { if( no == (\"deptno\")) ++no; else } (no); (\"\" + no); (); (); (); (); (\"某部门\"); (1000000); (0); break; } catch (InstantiationException e1) { } catch (IllegalAccessException e1) { } catch (ClassNotFoundException e1) { } catch (SQLException e1) { } } private void createAddInterface() { Container contentPane = getContentPane(); JLabel label1 = new JLabel(\"部门编号:\"); JPanel panel1 = new JPanel(); deptNoText = new JTextField(10); (label1); (deptNoText); JLabel label2 = new JLabel(\"部门名称\"); JPanel panel2 = new JPanel(); deptNameText = new JTextField(10); (label2); (deptNameText); JLabel label3 = new JLabel(\"部门电话\"); JPanel panel3 = new JPanel(); deptTelText = new JTextField(10); (label3); (deptTelText); confirmButton = new JButton(\"保存\"); cancelButton = new JButton(\"重置\"); JPanel panel4 = new JPanel(); (confirmButton); (cancelButton); (new ConfirmAction()); (new CancelAction()); (false); (WIDTH,50); (0, 0); (WIDTH,50); (0,50); (WIDTH,50); (0,100); (WIDTH,50); (0,150); (panel1); (panel2); (panel3); (panel4); } private void storeDepartment() { int rs; Jdbc conn = null; try { conn = new Jdbc(); PreparedStatement pstmt = \"insert into department (1, ()); (2, ()); (3, ()); (4, ()); values(,,,)\"); rs = (); if( rs !=0 ) { (null, \"保存成功\"); (); } else { (null, \"保存失败\"); (); } 5 测试 部门信息删除和增加模块测试 模块采用黑盒测试策略,设计测试用例实例如下: 表5.1.1测试用例 序号 1 2 3 4 输入数据 从文本框中输入一个要删除的部门号(102005) 从文本框中输入一个要删除的部门号(102007) 在各文本框中输入相应的内容并保存 在部门编号文本框中输入数字并保存 预期结果 正常删除 异常删除 正常添加 异常添加 测试结果如下: 图5.1.1测试用例1输入 图测试用例1结果 图5.1.3测试用例2输入 图 测试用例2输出结果 图5.1.5测试用例3输入 图测试用例4输出结果 图5.1.5测试用例4输入 图5.1.5测试用例4输出结果 测试结论:该模块功能基本正常,能够接受合法的输入,并能产生相应的输出结果,对于非法的输入,系统采取的策略时忽略非法请求,直到用户输入正确的合法的数据才给以响应并产生正常的输出. 6课程设计的总结与体会 这次课程设计中我负责的是概要设计和详细设计这两个模块。概要设计中包括:系统设计总体思想,系统功能模块设计,系统数据库设计。其中系统设计总体思想主要说明了该系统是主要处理的事务以及系统的各个主要功能以及各功能模块之间的层次关系。系统功能模块主要说明了该系统是的实现各操作的流程。系统数据库设计则主要说明了各业务之间的联系,以及各个实体之间的联系。 详细设计这个模块中包括:数据结构设计,程序数据结构设计,模块功能详细设计。数据库表结构设计则主要定义了该系统所需的表格结构。程序数据结构设计则定义了该系统所用到的数据结构。模块功能详细设计则主要用来实现各功能的模块。在这个模块中我们通过类图来实现各类之间的调用关系,设计好操作界面,编写好实现部分模块的功能。而详细设计这个模中,我主要的工作是负责部门管理这个模块功能的设计。在这个模块中,我为部门管理增加了两个功能:一个部门信息的增加,另一个是部门信息的删除。这两个操作主要是通过菜单操作实现的。如要删除某个部门信 息则在部门菜单上选择删除菜单项,在弹会的对话框中输入要删除的部门号再单击确定即可实现删除操作。 通过次课程设计使我明白了合作的重要性,分工明确,培养了我良好的团队合作精神。同时我也掌握了软件开发的具体流程以及开发方式。 参考文献 [1]任胜兵、邢琳.软件工程.[M].北京:北京邮电大学出版社.2006:76-244. [2]Shari Lawrence Pfleeger 、Joanne .软件工程-理论与实践(第三版影印版)[M]. 北京:高等教育出版社.:141-209,337-362. [3]阎菲.Java程序设计教程.北京:中国水利水电出版社.2004:154-233. [4]Harvey Paul 程序设计教程.北京:机械工业出版社.. [5]孙风栋 等.Oracle数据库基础教程.北京:电子工业出社.:276-358. 致谢 在这里我要特别感谢我们的指导老师姚老师和组长王培同学,谢谢他们不厌其烦的帮助我。 因篇幅问题不能全部显示,请点此查看更多更全内容