资源描述
word1 前言课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的、必不可少的一个教学环节。通常,课程设计中的问题比平时的习题复杂得多,也更接近实际。课程设计着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力。另一方面,使书上的知识变活,起到深化理解和灵活应用教学内容的目的。平时的习题局限于一个和二个知识点,而课程设计题是软件设计的综合训练,包括问题分析,总体结构设计,用户界面设计、程序设计、根本技能和技巧,以与一整套软件工作规X的训练和科学作风的培养。我们这组选的课题是工资管理系统的设计与开发。从接到任务书开始,我们首先完成了系统的需求分析与概要设计,在完成这些任务时,我们深感理论与实践的结合的是需要一个过程。从个人分工到整个系统分析,从设计到测试之所以能顺利完成是和大家的努力分不开的。虽然还有一些不足之处,但是我们还是从中获益不少。下面简要介绍一下我们课题组的分工,我们这组的分工其实借鉴了Shari Lawrence Pfleeger 和Joanne M.Atlee 合著的 SOFTWARE ENGINEERING Theory and Practice (高等教育第三版影印版)中的一些理论,这些知识可以参考此书的第25页中关于“开发团队的角色分工一节。根据分工的细化和局部重叠原如此,我们组的具体分如下: (1)项目管理 : 王培 (2)需求分析 : 钟耀明、贺纯 (3)概要设计 : 贺纯、赵亦娴 (4)详细设计 : 赵亦娴、王培、钟耀明、杨安、陈华、贺纯 (5)程序编码 : 王培、陈华 (6)系统测试 : 陈华、杨安我的主要任务是概要设计和详细设计2需求分析2.1 任务概述 现代企业根本上都引进了计算机软件对公司业务进展管理,这样做有很多优点,一是提高了工作的效率,同时也减少了手工操作的错误以与人员的开支。本课题开发的工资管理系统正是基于这样的目的实现的,系统完成的主要功能是对员工工资的管理,同时还包括对员工信息、部门信息以与附属于员工、部门的职称和职务信息的管理。系统主要采用事务型数据库设计,但对于员工工资的信息,系统能够保存其相应的历史记录,包括员工的请假信息,出差信息以与工资结算信息等。本系统面向员工和管理人员同时开放,普通用户可以进展查询以与对个人相关信息的修改等操作,管理账户如此拥有系统的全部功能。系统不允许非经认证通过的用户使用系统。系统采用ASP.NET语言开发,系统的数据使用SQL数据库进展管理。2. 功能需求分析1系统能够维护员工的根本信息,部门、职务、职称以与工资记录等信息。2系统应该能记录员工的每一个职称信息,并授予相应的职称,系统在计算员工工资的时候选取职称对应的最高职称津贴。3工资表应当由系统自动生成。系统负责员工的工资表以与员工工资的历史记录与记录员工的请假信息和出差信息等意外情况。4系统可以给管理员提供权限增加删除修改系统用户以与其它实体信息,系统的局部权限不能下放给普通用户以保证系统的安全性以与数据的正确性。2.3 外部接口需求分析系统人机交互界面为半屏幕大小,采用上下左右居中方式显示,系统分辩率默认设置为1280*800,实际的界面大小由具体的屏幕决定。主界面包括标题栏,菜单栏,快捷工作区,帮助信息区默认是隐藏的。每一个菜单对应一个键盘快捷键区。2.4 性能需求分析系统在主频1.5GHZ,内存512MB,总线频率667MHZ的硬件平台上运行时,系统的响应时间、更新处理时间、数据转换与传输时间、运行时间均能达到毫秒级。系统支持用户并发操作,事务采用可串行化隔离级别,防止在读写过程中产生的丢失修改、读脏数据、不可重复读等一系列由并发操作带来的不一致问题。系统的运行主存控制在1024KB以内,响应时间控制在1000ms以内,系统对数据的存储空间取决于数据库系统表空间的约束限制。2.5 软件属性需求分析系统必须保证所有操作结果以与存储数据的正确性,对于用户的非法操作,系统必须能够提出告警信息,对于用户的错误操作,系统能够提供错误信息以与错误源。在数据库操作上的异常,系统也应捕捉到并提供界面化的提示信息,对于可能会产生错误的操作,应当能够防X。另外系统必须提供一定的安全某某性,一些某某信息只针对特定的用户提供。它人员无法访问。软件必须为中文操作界面,并且所有的中文功能菜单项描述须与其实际对应的功能相一致,不能存在功能不足或者功能不对的情况,软件采用面向对象技术架构,遵循代码编写规X,提供适当的代码注释,尽可能地采用可复用技术,提高软件的可维护性。概要设计3.1 系统设计总体思想当工资管理系统处理的事务主要有工资管理,员工信息管理,部门信息管理,职务信息管理,职称信息管理。职务和职称以与部门信息管理主要服务于工资管理和员工信息管理,系统接收的输入项目有员工信息,部门信息,职务信息,职称信息,请假信息,出差信息等。系统能够承受用户的请求,显示相应的查询信息,增加、删除、修改相应的合法的信息。图3.1.1 工资管理系统HIPO图图3.1.1是工资管理系统的HIPO图,上图主要说明了系统的各个主要功能以与各功能模块之间的层次关系。上图的根本框架也是整个系统界面的基要框架。系统的人机交互采用图形化用户界面,考虑到系统的平台无关性,系统由JAVA语言实现,系统的界面元素也是采用了JAVA的JFC图形类库。系统可以在安装了JAVA运行环境的平台上运行。系统从登录界面开始,要求验证用户信息,用户通过验证后,进入系统主界面。主界面提供了一个菜单框架,可以通过各个菜单类的一个实例来加载菜单,这一步不是由主界面完成的,而是由所需要被加载的类完成的,但需要主界面类去生成这些菜单英的实例。系统加载的功能主要包括系统管理,用户管理,工资管理,部门管理,职务管理,职称管理以与适当的帮助信息。系统管理主要向用户提供用户更改密码的操作以与退出程序的功能。用户管理允许管理员新建一个员工信息,比如当公司新增加了一个员工时,系统为该员工生成相应的工资关系,但新建这个员工的信息如此是第一环节,当然如果公司离任了一名员工时,此员工与公司的工资关系已解除,如此没有必要保存该员工的信息,系统应向管理员提供删除该员工的功能,同时删除与该员工相关的所有其它信息。公司所在的员工可能有局部具有相应的职称,考虑到职称的种类繁多,系统只添加本公司员工所拥有的职称的一个集合,而不考虑外界的因素,因此系统提供了增加、删除、修改、查询等对职称的相关操作。例如,当公司一员工拿到高级职称后,管理员首选应该查看系统是否记录了相应职称的信息,如果有,如此直接将该职称信息添加到员工信息中去,如果没有,如此应当先增加这一职称信息,再执行上述操作。另外在删除一个职称的时候,系统要求必须没有员工拥有此职称,否如此系统不能删除,如果确实要删除,如此只能先删除拥有此职称的所有员工或者撤销拥有此职称的所有员工的此职称。3.2 系统功能模块设计图3.2.1 系统功能模块设计3.3 系统数据库设计 通过对工资管理系统的数据分析并根据业务之间的联系,我们可以得出与系统相关的实体有:员工、部门、职务、职称、请假信息、出差信息、工资。工资管理系统的数据据库管理模式用语义描述如下:(1) 每一个员工只能属于一个部门,担任一个职务,但是可以拥有多个职称.(2) 每个部门可以有多名员工,有不同的职务.(3) 每个职务可以由多名员工担任,可以在一样的部门,也可以在不同的部门.(4) 每个职称可以授予不同的员工.(5) 每个员工每个月都会有一份工资记录,并且会有一份历史工资记录.(6) 员工每个月可以请假屡次或者出差屡次.但是要扣除相应的工资或者获得相应的补助.每个员工都有一分历史请假记录和历史出差记录。综合上述语义,可以得出系统的ER图如图3.3.1所示:3.3.1 工资管理系统ER图根据实体之间的联系,以与分析实体的属性,得出了工资管理系统中各个实体的属性,相关属性列表见表3.3.1。表3.3.1 工资管理模型的相关属性列表实体或联系属性员工员工编号、某某、性别、部门号、职务部门部门编号、名称、人数、 职务职务编号、名称、根本工资职称职称编号、名称、职称津贴出差信息出差编号、员工编号、天数、出差年份、出差月份、出差补助员工职称信息员工编号、职称编号请假信息请假编号、员工编号、天数、年、月、扣除工资、请假原由工资工资编号、员工编号、工资所属年月、根本工资、扣除工资、出差补助、岗位工资、职称津贴、工资总额说明:加粗局部为主键,加底线局部为外键图3.3.2 实体与其相关属性图详细设计4.1 数据结构设计4.1.1 数据库表结构设计Employee员工信息表字段名数据类型约束名称说明empnonumber(6)主键员工编号enamevarchar2(20)not null员工某某sexvarchar2(4)not null性别deptnonumber(6)外键department(deptno)部门编号dutynonumber(6)外键duty(dutyno)职务编号Department-部门信息表字段名数据类型约束名称说明deptnonumber(6)主键部门编号deptnamevarchar2(20)not null部门名empnumnumber部门人数telnumberDuty-职务信息表字段名数据类型约束名称说明dutynonumber(6)主键职务编号dutynamevarchar(20)not null职务名dutypaynumberdefault(0), check(dutypay=0)职务根本工资Title-职称信息表字段名数据类型约束名称说明titlenonumber(6)主键职称编号titlenamevarchar2(20)not null职称名titlepaynumberdefault(0), check(titlepay=0)职称津贴TitledEmployee-员工职称联系表字段名数据类型约束名称说明empnonumber(6)组合主键, 外键employee(empno)员工编号titlenonumber(6)职称编号yearnumber(4)年记录职称授予时间monthnumberbetween 1 and 12月Leave-员工请假信息表字段名数据类型约束名称说明leavenonumber(6)主键请假编号empnonumber(6)外键employee(empno)请假员工leavedaysnumbernot null请假天数leaveyearnumber(4)not null请假年份leavemonthnumbernot null请假月份deductionnumbernot null扣除工资reasonvarchar(60)请假原因BusinessTravel-出差信息表字段名数据类型约束名称说明travelnonumber(6)primary key出差编号empnonumber(6)外键employee(empno)员工编号traveldaysnumbernot null出差天数travelyearnumber(4)not null出差年份travelmonthnumbernot null出差月份travelpaynumbernot null出差补助Reward-奖励信息表字段名数据类型约束名称说明rewardnonumber(6)primary key奖励编号empnonumber(6)外键employee(empno)员工编号rewardyearnumber(4)not null奖励年份rewardmonthnumbernot null奖励月份rewardpaynumber奖励金额reasonvarchar(60)奖励原由Penalty-罚金信息表字段名数据类型约束名称说明penaltynonumber(6)primary key罚金编号empnonumber(6)外键employee(empno)员工编号penaltyyearnumber(4)not null罚金年份penaltmonthnumbernot null罚金月份penaltynumnumber罚金额度reasonvarchar(60)罚金原由Salary-职工工资信息表字段名数据类型约束名称说明salnonumber(6)primary key工资编号empnonumber(6)外键employee(empno)员工编号payyearnumber(4)工资年份paymonthnumberbetween 1 and 12工资月份basepaynumber根本工资deductionnumber请假扣除金额travelpaynumber出差补助dutypaynumber职务工资titlepaynumber职称津贴rewardpaynumber奖励金额penaltynumnumber罚金totalpaynumber工资总额4.1.2 程序数据结构设计(1)ADT DepartmentBean数据对象:D=deptNo,deptName,empNum,tel|deptNo,empNumt和tel均为整数,deptName为字符串数据关系:R1=|deptNo为部门编号,deptName为部门号,tel为部门 R2=|deptNo为部门编号,empNum为部门人数根本操作:setDeptNo(int no):设置部门的部门号为no.getDeptNo ():返回部门的部门号。setDeptName(Stringname):设置部门的部门名为name.getDeptName():返回部门的部门号.setEmpNum(int num):设置部门的员工人数为num.getEmpNum():返回部门的人数.setTel(int telephone):设置部门的 为telephone.getTel():返回部门的 。ADTDepartmentBean(2)ADTJdbc数据对象:D=dbUrl,theUser,thePsw,c,stmt,rs|dbUrl提供数据库对象,theUser,thePsw指定用户名和密码,c与数据库建立一个连接,stmt声明一条SQL语句,rs保存执行SQL语句的结果集.数据关系:R1:用户登陆的验证信息用户名和密码.R2:rs为语句stmt执行的结果集.根本操作:Jdbc():加载数据库驱动,建立数据库连接.executeUpdate(String sql):执行SQL更新语句,成功返回TRUE,失败如此返回FALSE.executeQuery(String sql):执行SQL查询语句,返回结果集rs.close():关闭与数据库的连接.ADTJdbc4.2 模块功能详细设计4.2.1 部门信息删除模块设计1类图设计图4.2.1.1 部门信息删除模块类图以下对局部类的属性和方法的说明:DepartmentMenu类:属性名称属性类型属性说明deptMenuJMenu顶层菜单项deptInqueryItemJMenuItem部门信息查询菜单项deptDeleteItemJMenuItem部门信息删除菜单项deptUpdateItemJMenuItem部门信息更新菜单项UserUserBean用户业务类说明: 当点击各菜单项时,会弹出相应的操作界面。DepartmentDelete类:方法名称返回值类型功能说明isDeptExist()boolean判断输入的部门号是否存在isDeptEmpty()boolean判断输入的部门号是否为空executeDelete()void执行删除操作ShowAction 类:该类为内部类,是将各功能集成到系统的框架之中.ShowAction类的构造函数提供了一个命名菜单项的方法,主要功能引入了DepartMentDelete这个类到系统中。通过监听器ShowAction执行actionPerformed()方法,系统就应该可以产生期望的动作。2界面设计图4.2.1.2 界面设计界面设计说明:该文本框为单行文本框,可以输入要删除的部门号,当系统监听到文本框中选项被确定,将会自动地将该部门信息从数据库中删除。3核心代码public class DepartmentDeletepublic DepartmentDelete() executeDelete();private boolean isDeptExist(int deptno)ResultSet rs; Jdbc conn=null;boolean flag = false;try conn = new Jdbc();rs = conn.executeQuery(select deptno from department ); while(rs.next() if( deptno = rs.getInt(deptno) flag = true; break; catch (InstantiationException e1) e1.printStackTrace(); catch (IllegalAccessException e1) e1.printStackTrace(); catch (ClassNotFoundException e1) e1.printStackTrace(); catch (SQLException e1) e1.printStackTrace(); return flag;public boolean isDeptEmpty(int deptno)ResultSet rs; Jdbc conn=null;boolean flag = false;try conn = new Jdbc();rs = conn.executeQuery(select count(*) from employee where deptno=+deptno); while(rs.next() if( rs.getInt(1) = 0) flag = true; break; catch (InstantiationException e1) e1.printStackTrace(); catch (IllegalAccessException e1) e1.printStackTrace(); catch (ClassNotFoundException e1) e1.printStackTrace(); catch (SQLException e1) e1.printStackTrace(); return flag;private void executeDelete() String deptnoStr = JOptionPane.showInputDialog(null,请输入待删除部门编号!); int deptno=0; boolean flag =true; try deptno = Integer.parseInt(deptnoStr); catch(Exception e) flag=false; if( isDeptExist(deptno) = true ) if( isDeptEmpty(deptno) = false ) JOptionPane.showMessageDialog(null,部门中有员工存在,无法删除!); else Jdbc conn = null; int res=0; try conn = new Jdbc();PreparedStatement pstmt = conn.c.prepareStatement(delete from department where deptno=?);pstmt.setInt(1, deptno);res = pstmt.executeUpdate();if( res !=0 ) JOptionPane.showMessageDialog(null, 成功删除部门+deptno);else JOptionPane.showMessageDialog(null, 删除失败); catch (InstantiationException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); catch (ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace(); else if(flag) JOptionPane.showMessageDialog(null, 您输入的部门号不存在!);/executeDelete4.2.2 部门信息增加模块设计1类图设计根据系统的需求,我们需要使得系统能够通过图形化的界面来增添一个部门,并将输入的部门信息长久得保存在数据库文件中,为此我们需要一个从界面类到与数据库连接的底层类的一系列类的组合来实现这样的需要. 图4.2.1.2所示的类图就是一个增加新员工的实现过程,DepartmentAdd类是一个继承自javax.swing.JFrame类的界面类,它提供了一个供录入员工信息的操作界面,所有录入的信息,如此通过DepartmentBean类生成一个实例对象来保存,departmentAdd类的构造函数负责调用createAddInterface()私有方法来构造出界面,以与初始化各控件中的数值,如generateDeptNo()是生成部门编号,部编号并不能由用户或者管理员确定,而是由系统查询数据库后,遵循唯一性原如此生成出来的编号.这样做不仅防止用户管理编号的繁琐性,而且也增强了系统的安全性.图4.2.2.1 部门信息的增加功能模块类图以下局部类的属性和方法的说明:DepartmentMenu类:属性名称属性类型属性说明deptMenuJMenu顶层菜单项deptInqueryItemJMenuItem部门信息查询菜单项deptDeleteItemJMenuItem部门信息删除菜单项deptUpdateItemJMenuItem部门信息更新菜单项UserUserBean参数传递说明: 当点击各菜单项时,会弹出相应的操作界面。Load Department方法是用来加载Departmentmenu类 。DepartmentAdd类:属性名称属性类型属性说明deptNoTextJTextFied部门编号输入文本框deptNameTextJtextFied部门名称输入文本框deptTelTextJTextFied部门 输入文本框confirmButtonutton确定按钮cancelButtonutton取消按钮deptDepartmentBean参数传递DepartmentAdd类:方法名称返回值类型功能说明DepartmentAdd()void是Departmentadd类的构造函数InitDeptInfo()void初始化部门信息genertateDeptNo()void产生部门编号CreateAddInterface()void创建增加信息界面StoreDepartment()void将新的信息保存到数据库中ShowAction 类:该类为内部类,是将各功能集成到系统的框中.ShowAction类的构造函数提供了一个命名菜单项的方法,主要功能是引入DepartMentDelete这个类到系统中。通过监听器ShowActionactionPerformed()方法,系统就应该可以产生期望的动作。监听器ConfirmAction和CancelAction这两个监听器实现的均是java.awt.event.ActionListener接口,系统通过监听器响应用户的保存或者取消操作,调用数据库类Jdbc来执行SQL存储语句实现与数据库的连接以与对数据库的增加信息操作。2界面设计图4.2.2.2 增加部门信息界面界面说明:以上文本框都是单行文本框,可以输入部门编号,部门名称,部门 ,当系统监听到文本框中的内容被确定,将会新的部门信息保存到数据库中。3核心代码public class DepartmentAdd extends JFrame this.setTitle(Add a new Department!); this.setSize(WIDTH,HEIGHT); this.setLayout(null); this.setResizable(false); v Dimension scr=Toolkit.getDefaultToolkit().getScreenSize(); Dimension frm=this.getSize(); this.setLocation(int)(scr.getWidth()-frm.getWidth()/2, (int)(scr.getHeight()-frm.getHeight()/2-50); createAddInterface(); generateDeptNo(); initDeptInfo();private void initDeptInfo() dept.setDeptName(某部门); dept.setTel(1000000); dept.setEmpNum(0);private void generateDeptNo() ResultSet rs; Jdbc conn=null;int no = 102001;try conn = new Jdbc();rs = conn.executeQuery(select deptno from department order by deptno); while(rs.next() if( no = rs.getInt(deptno) +no; else break; dept.setDeptNo(no); deptNoText.setText( + no); catch (InstantiationException e1) e1.printStackTrace(); catch (IllegalAccessException e1) e1.printStackTrace(); catch (ClassNotFoundException e1) e1.printStackTrace(); catch (SQLException e1) e1.printStackTrace(); private void createAddInterface()Container contentPane = getContentPane(); JLabel label1 = new JLabel(部门编号:); JPanel panel1 = new JPanel(); deptNoText = new JTextField(10); deptNoText.setEditable(false); panel1.add(label1); panel1.add(deptNoText); JLabel label2 = new JLabel(部门名称); JPanel panel2 = new JPanel(); deptNameText = new JTextField(10); panel2.add(label2); panel2.add(deptNameText); JLabel label3 = new JLabel(部门 ); JPanel panel3 = new JPanel(); deptTelText = new JTextField(10); panel3.add(label3); panel3.add(deptTelText); confirmButton = new utton(保存); cancelButton = new utton(重置); JPanel panel4 = new JPanel(); panel4.add(confirmButton); panel4.add(cancelButton); confirmButton.addActionListener(new ConfirmAction(); cancelButton.addActionListener(new CancelAction(); panel1.setSize(WIDTH,50); panel1.setLocation(0, 0); panel2.setSize(WIDTH,50); panel2.setLocation(0,50); panel3.setSize(WIDTH,50); panel3.setLocation(0,100); panel4.setSize(WIDTH,50); panel4.setLocation(0,150); contentPane.add(panel1); contentPane.add(panel2); contentPane.add(panel3); contentPane.add(panel4); private void storeDepartment()int rs; Jdbc conn = null; try conn = new Jdbc();PreparedStatement pstmt = conn.c.prepareStatement(insert into department values(?,?,?,?);pstmt.setInt(1, dept.getDeptNo();pstmt.setString(2, dept.getDeptName();pstmt.setInt(3, dept.getEmpNum();pstmt.setInt(4, dept.getTel(); rs = pstmt.executeUpdate(); if( rs !=0 ) JOptionPane.showMessageDialog(null, 保存成功); this.dispose(); else JOptionPane.showMessageDialog(null, 保存失败); this.dispose(); 5 测试5.1 部门信息删除和增加模块测试 模块采用黑盒测试策略,设计测试用例实例如下:序号输入数据预期结果1从文本框中输入一个要删除的部门号(102005)正常删除2从文本框中输入一个要删除的部门号(102007)异常删除3在各文本框中输入相应的内容并保存正常添加4在部门编号文本框中输入数字并保存异常添加测试结果如下:图5.1.3测试用例2输入 图5.1.4 测试用例2输出结果图5.1.5测试用例4输入 图5.1.5测试用例4输出结果 测试结论:该模块功能根本正常,能够承受合法的输入,并能产生相应的输出结果,对于非法的输入,系统采取的策略时忽略非法请求,直到用户输入正确的合法的数据才给以响应并产生正常的输出.6课程设计的总结与体会这次课程设计中我负责的是概要设计和详细设计这两个模块。概要设计中包括:系统设计总体思想,系统功能模块设计,系统数据库设计。其中系统设计总体思想主要说明了该系统是主要处理的事务以与系统的各个主要功能以与各功能模块之间的层次关系。系统功能模块主要说明了该系统是的实现各操作的流程。系统数据库设计如此主要说明了各业务之间的联系,以与各个实体之间的联系。详细设计这个模块中包括:数据结构设计,程序数据结构设计,模块功能详细设计。数据库表结构设计如此主要定义了该系统所需的表格结构。程序数据结构设计如此定义了该系统所用到的数据结构。模块功能详细设计如此主要用来实现各功能的模块。在这个模块中我们通过类图来实现各类之间的调用关系,设计好操作界面,编写好实现局部模块的功能。而详细设计这个模中,我主要的工作是负责部门管理这个模块功能的设计。在这个模块中,我为部门管理增加了两个功能:一个部门信息的增加,另一个是部门信息的删除。这两个操作主要是通过菜单操作实现的。如要删除某个部门信息如此在部门菜单上选择删除菜单项,在弹会的对话框中输入要删除的部门号再单击确定即可实现删除操作。通过次课程设计使我明白了合作的重要性,分工明确,培养了我良好的团队合作精神。同时我也掌握了软件开发的具体流程以与开发方式。参考文献1任胜兵、邢琳软件工程M:邮电大学2006:762442Shari Lawrence Pfleeger 、Joanne M.Atlee.软件工程理论与实践(第三版影印版).:高等教育2008.5:141209,337-362.3阎菲.Java程序设计教程.:中国水利水电.2004:154-233.4Harvey M.Deitel Paul J.Deitel.Java程序设计教程.:机械工业.2006.1.5孙风栋 等.Oracle数据库根底教程.:电子工业出社.2008.6:276-358.致谢在这里我要特别感谢我们的指导教师姚教师和组长王培同学,谢谢他们不厌其烦的帮助我。26 / 26
展开阅读全文