面向对象分析与设计课程设计指导.doc
一、 系统概况1、 现状分析2、 系统目标3、 系统目标二、 系统分析1. 业务事件分析2. 标识用例3. 编写基本用例叙述4.为每个用例场景绘制系统时序图5.域模型6.系统操作约定三、系统设计1.整体系统结构设计2.系统程序结构设计3.设计用户界面4.数据库设计四、系统实现附:面向对象的系统分析和设计课程设计报告面向对象的系统分析和设计人事管理系统 指导教师:刘永前老师作者:周洪亮() 黄晓芳() 胡忠义() 徐 会()人事管理系统三、 系统概况1、 现状分析随着全球经济一体化的进程,人事管理日趋复杂,人力资源成为现代企业生存和发展的重要因素。企业人事部门传统的档案手工管理繁琐,效率低下而且容易出错,已经无法适应现代企业日益庞大的人力资源现状。同时,随着计算机技术的迅猛发展,办公自动化成为现实,利用计算机实现企业人事管理势在必行。企业人事管理系统综合运用人事管理相关领域的只是、结合计算机技术,科学的管理企业的人事档案、考勤、绩效考核等信息,具有检索迅速、操作方便、存储量大、保密性高、成本低等特点,可以大大提高工作效率;同时引导企业按照科学的管理理念对人力资源进行规范化的管理。2、 系统目标人事部门传统的手工管理主要包括人事档案管理,人员工作调动记录,员工考勤记录和统计,绩效考评级原始工资核算。其中考勤管理对实时性要求较高,工资管理涉及到财务部门,且业务比较复杂。本系统只是对人事管理系统的简单实现,主要实现员工基本信息、部门信息、培训信息、奖惩信息和薪资信息的管理。3、 系统目标本系统采用面向对象的技术进行系统的分析和设计。面向对象的技术将系统中涉及到的事件和属性封装成合理的类和对象。UML(Unified Modeling Language)是统一建模语言,它图形化的实现了面向对象的技术。本系统使用在面向对象的系统分析和设计中,使用UML建模语言实现可视化中间过程。严格按照Rational统一过程(Rational Unified Process,RUP)中的建模过程。建模工具。四、 系统分析确定用户需求是信息系统分析的主要任务。本部分将严格按照面向对象系统分析(OOA,Object-Oriental Analysise)的六步骤:(1)标识业务事件并制作事件表(2)标识用例并生成系统用例图(3)为每个业务事件的系统响应编写基本用例叙述(4)为每个用例场景绘制系统时序图(5)生成域模型,以表示系统问题域中的概念、属性和关联(6)为每项系统操作编写约定1、业务事件分析首先叙述系统操作过程:人事管理人员登录系统后,可以进行个人信息管理,包括修改密码和个人部门修改等。当需要修改员工基本信息时,可以进入基本信息模块,在该模块中除了修改员工信息外,还可以进行添加、删除、查询等操作。同样,可以对员工部门、培训、薪资等信息进行类似操作。在每个星期一系统自动输出该星期员工培训计划,并将计划给领导及员工阅览。通过上面的叙述,可以找到一下业务事件。(1)人事管理人员登录系统。外部事件。在登录界面通过输入账户和密码,验证通过后进入主界面。如果验证未通过,登录失败。(2)人事管理人员管理员工基本信息。外部事件。人事管理人员在登录系统后,添加、删除、修改、查询员工基本信息。(3)人事管理人员管理员工培训信息。外部事件。人事管理人员登录系统后,添加、删除、修改员工培训信息。(4)人事管理人员管理员工奖惩信息。外部事件。人事管理人员登录系统后,添加、删除、修改员工奖惩信息。(5)人事管理人员管理员工薪资信息。外部事件。人事管理人员登录系统后,添加、删除、修改员工薪资信息。(6)人事管理人员管理部门信息。外部事件。(7)人事管理人员查询员工信息。外部事件。人事管理人员可以按照姓名、部门等条件查找符合条件的员工,并返回员工列表。(8)到了打印员工培训计划的时间了。定时事件。打印的培训计划给领导和员工。图1所示的是人事管理系统的事件列表。【图1】事件编号事件描述系统输入提供输入的参和者系统输出接收输入的参和者1人事管理人员登录系统账户和密码人事管理人员2人事管理人员管理员工基本信息员工姓名或基本信息人事管理人员员工信息列表人事管理人员3人事管理人员管理员工培训信息员工姓名、培训信息人事管理人员员工培训列表人事管理人员4人事管理人员管理员工奖惩信息员工姓名、奖惩信息人事管理人员员工奖惩列表人事管理人员5人事管理人员管理员工薪资信息员工姓名、薪资信息人事管理人员员工薪资列表人事管理人员6人事管理人员管理部门信息部门信息人事管理人员部门列表人事管理人员7人事管理人员查询信息员工姓名或部门人事管理人员员工或部门等列表人事管理人员8到了打印员工培训计划的时间了培训计划列表人事管理人员、员工、领导。9修改个人密码密码人事管理人员以上事件中,除了“到了打印员工培训计划的时间了”为定时事件,其他均为外部事件。2、标识用例标识用例从事件列表开始。在事件列表中所列的每个业务事件均是一个用例。用例图如图2【图2】可以看到,参和者主要包括人事管理专职、员工、领导。其中在“打印培训计划”用例中,人事管理专职、员工和领导均为加入参和者,在其他用例总,人事管理专职均为发起参和者。3、编写基本用例叙述用例叙述是系统相应参和者操作所依据的内部操作顺序的叙事描述。下面就对在第2步中发现的用例进行基本用例叙述。(1)登录系统用例的扩张基本用例叙述:用例:登录系统参和者:人事管理专职目的:人事管理专职登录到人事管理系统,并进行一系列操作。概述:人事管理专职请求登录到系统,输入账户和密码,验证合格后登录到主界面。类型:基本前提条件:系统开放登录操作。后置条件:人事管理人员登录到系统特殊需求:系统必须在10秒内响应。事件流参和者操作系统响应1当管理人员需要登录到系统时,用例开始。2.管理人员提供自己的账户和密码 3系统验证账户和密码,登录到系统并显示主界面候选事件流1:第2步输入了无效的账户和密码。指示错误。返回至步骤2(2)人事管理人员管理员工基本信息:用例:管理员工基本信息参和者:人事管理专职目的:人事管理专职登录到人事管理系统,并进行添加、修改、删除等操作。概述:人事管理专职登录到人事管理系统,然后选择添加、修改、删除选项,打开相应界面并进行添加、修改、删除等操作。类型:基本前提条件:管理人员成功登录到系统后置条件:完成相应操作特殊需求:系统必须在10秒内响应。事件流参和者操作系统响应1当管理人员需要编辑员工信息时,用例开始。2.管理人员选择添加、修改、删除操作。 3系统打开相应的界面4管理人员选择要编辑的员工,并输入信息,如 5.系统提交修改的信息,返回操作结果。员工姓名等信息。候选事件流1:第4步输入了无效的信息。指示错误。返回至步骤4管理部门信息、管理培训信息、管理奖惩信息、管理薪资的用例和以上用例类似,这里就不再累赘了 。(3)打印培训计划用例描述:用例:打印培训计划参和者:人事管理专职、员工、领导目的:在定时时间打印培训计划概述:每到星期一某时刻,系统自动打印培训计划,并由管理人员交和员工和领导。类型:基本前提条件:系统运作中后置条件:打印出培训计划特殊需求:系统必须在10秒内响应。事件流参和者操作系统响应1当到星期一某时刻时,用例开始。 2.系统自动打印培训计划。3管理人和啊交和员工和领导。候选事件流1:第2步打印出错或无打印纸,显示无效信息。返回步骤2。(4)管理人员修改个人密码:用例:管理人员修改个人密码参和者:人事管理专职目的:修改个人密码概述:选择修改密码操作,然后输入原有密码和新密码。类型:基本前提条件:系统运作中后置条件:密码修改成功特殊需求:系统必须在10秒内响应。事件流参和者操作系统响应1当需要修改密码时,用例开始。 2输入原有密码和新密码。 3.系统将确认原密码正确,然后更新密码,并返回正确信息。候选事件流1:第2步输入的原密码有错误,显示错误信息。返回步骤2。4.为每个用例场景绘制系统时序图时序图显示了参和者和使用用例场景的系统之间的交互。管理员工信息等用例图均可由添加员工信息时序图、修改员工信息时序图、删除员工时序图表现。!(1)登录系统时序图:操作介绍:用户首先运行系统,首先由LoginDialog创建登录对话框LoginDialog,然后用户输入用户名和密码,系统确认成功后,查找Manager数据表中该用户所属权限,打开相应的主界面,即MainWindow。(2)修改密码时序图:操作介绍:人事管理人员在MainWindow中选择修改密码操作,打开修改密码窗口(AmendPasswordDialog),输入密码,执行修改命令(AmendPassword(),系统从数据库中读出原密码,并设置为新密码,更新操作。方法介绍:(3)添加员工时序图:操作介绍:人事管理人员在MainWindow窗口中选择管理员工操作,然后在EmployeeManageDialog窗口添加用户,输入相应信息,提交给系统。系统首先会查询数据库中是否有和之一致编号的员工,如果没有,则会生成一个新的员工(Employee),并将该新员工添加至数据库中。并返回员工列表。(4)删除员工时序图操作介绍:人事管理人员在MainWindow窗口中选择管理员工操作,然后在EmployeeManageDialog窗口查找员工,提交给系统。用户选择删除员工,则会将员工从数据库中删掉。(5)查询员工时序图信息查询用例可以由员工信息查询时序图、部门信息查询时序图、培训信息查询时序图、奖惩信息查询时序图等完成。在这里仅介绍查询员工的时序图。其他时序图以此类似。操作介绍:人事管理人员在主窗口选择员工信息查询操作,打开EmployeeQuery窗口,在该窗口中输入查询条件(员工名或编号),提交给系统查询,最后返回符合条件的员工列表。5.域模型生成域模型是面向对象系统分析过程的第五步,域模型是一个问题域结构的静态模型,它建立的是现实世界中概念的模型。域模型只包括属性,不包括行为。它 也不包括和实现用户界面相关的概念。分析可知,系统的域模型主要涉及以下几个概念:员工、人事管理人员、部门、奖惩、培训、薪资。6系统操作约定系统操作约定就是为系统时序图中的操作创建操作约定,包括操作的职责、类型、异常、输出、前提条件及后置条件等。(1)首先为管理人员登录系统的时序图的操作写操作约定:Login(ID,Password)的系统操作约定:约定名称:Login(ID,Password)职责:使用户登录到系统。类型:系统异常:用户名或密码不正确。输出:前提条件:系统能够识别用户输入的信息。后置条件:无FindManager(ID)的系统操作约定:约定名称:FindManager(ID)职责:查找条件为ID的用户。类型:系统异常:不存在该ID输出:用户类型前提条件:系统能够识别用户输入的信息,且存在该ID后置条件:无(2)添加员工的时序图的系统操作约定:ManageEmployee()的系统操作约定:约定名称:ManageEmployee()职责:管理员工信息,打开员工管理窗口。类型:系统异常:输出:打开员工管理窗口。前提条件:用户成功登录到系统。后置条件:无AddEmployee(id,name,depart)的系统操作约定:约定名称:AddEmployee(id,name,depart)职责:添加某员工信息。类型:系统异常:员工信息有误输出:员工列表。前提条件:系统允许添加员工信息。后置条件:无(3)删除员工信息中的DeleteEmployee(id)的系统操作约定:约定名称:DeleteEmployee(id)职责:删除某员工信息。类型:系统异常:不存在该id的员工输出:前提条件:系统允许用户删除员工信息。后置条件:无其他的系统操作不在这里累赘了。三、系统设计系统设计可以看做是一种关于如何实现用户需求的决策序列。需要进行的步骤有:(1)设计整体系统结构(2)涉及程序结构(交互图和类图)(3)设计用户界面(4)设计数据库下面就一步步进行系统的设计。1整体系统结构设计系统结构的设计将那些基本系统描述转换成了一种面向系统实现技术的描述。,它定义了系统的高层划分,确定了主要组件之间的接口。本系统设计的系统结构为双处理器系统,其中一个为人事管理系统应用处理器,主要完成各种应用的实现,这里将基本用例都分配给该处理器。另一个为数据库处理器,即将整个数据库分配给一个专用的数据库处理器。这样就把应用和数据处理严格的划分开。2.系统程序结构设计系统程序结构设计包括交互图设计和类图设计。交互图描述了程序中对象或类之间的消息。他表示对象间的协作。在UML中有两类交互图:顺序图和协作图。两种图都表示了对象或类间的消息。顺序图中表示参和者和系统之间的交互成为系统顺序图,也就是我们在系统分析中绘画的系统时序图(System Sequence Diagrams)。另外,表示系统内各对象的交互的顺序图成为设计顺序图(Design Sequence Diagrams)。在分析阶段画的时序图已经较详细的表示了系统内各对象的信息交互。下面是用协作图表示的参和交互的对象或类之间的消息。下面生成表示交互图中操作的设计类图。3.设计用户界面秉承方便实用的原则,将该系统界面按一下原则设计:(1)菜单选择,在主界面上方有一行菜单。(2)工具栏。主窗口左侧有一行图标工具栏。(3)下拉表单的设计。即在表单中,设置些下拉框,极其便利的输入相关信息。下图是设计好的图形界面。其主界面如图3.3.2,菜单及工具栏可以看到图3.3.1登录界面图3.3.2图3.3.3图3.3.4是员工基本信息管理在如图3.3.4员工基本信息管理窗口中,部门、性别、婚姻状况、政治面貌、学历及状态均使用下拉列表框,方便用户管理。图3.3.5基本信息查询4.数据库设计根据需求分析以及可以识别以下实体:员工信息、培训信息、奖惩信息、部门信息、薪资信息、管理员信息等实体。他们的属性及之间的关联见下面的概念数据模型。以下是PowerDesigner绘制的数据库的概念数据模型。(1)E-R图(2)数据字典根据数据库E-R图分析,分为6张表,Table List 及Table Columns List见下表。Table List:名称代码DepartmentInformationDepartmentInformationEmployeeInformationEmployeeInformationEncouragementPunishInformationEncouragementPunishInformationTrainInformationTrainInformationUserInformationUserInformationWageInformationWageInformationTable columns list1. DepartmentInformatioin表列清单: 名字代码数据类型备注D_NumberD_Numberintpk(PrimaryKey)D_NameD_Namevarchar(20)D_CountD_Countint2. EmployeeInformation表列清单: 名字代码数据类型备注E_NumberE_NumberintpkD_NumberD_NumberintfkE_NameE_NameVarchar(30)E_SexE_SexVarchar(20)E_BornDateE_BornDateDatetimeE_MarriageE_MarriageVarchar(4)E_PoliticsVisageE_PoliticsVisageVarchar(20)E_SchoolAgeE_SchoolAgeVarchar(20)E_EnterDateE_EnterDateDatetimeE_InDueFormDateE_InDueFormDatedatetimeE_DepartmentE_Departmentvarchar(20)E_HeadshipE_Headshipvarchar(20)E_EstateE_EstatedatetimeE_RemarkE_Remarkvarchar(500)3. EncouragementPunishInformation表列清单: 名字代码数据类型备注E_NumberE_Numberintpk,fkEP_NumberEP_NumberintpkEP_NameEP_Namevarchar(30)EP_DateEP_DatedatetimeEP_AddressEP_Addressvarchar(50)EP_CausationEP_Causationvarchar(200)EP_RemarkEP_Remarkvarchar(500)4. TrainInformation表列清单: 名字代码数据类型备注E_NumberE_Numberintpk,fkT_NumberT_NumberintpkT_ContentT_Contentvarchar(100)T_NameT_Namevarchar(20)T_DateT_DatedatetimeT_MoneyT_Moneyfloat5. UserInformation表列清单: 名字代码数据类型备注User_IDUser_IDvarchar(20)pkUser_NameUser_Namevarchar(20)PasswordPasswordvarchar(20)PopedomPopedomvarchar(20)6. WageInformation表列清单: 名字代码数据类型备注E_NumberE_Numberintpk,fkW_NumberW_NumberintpkW_NameW_Namevarchar(30)W_dateW_datedatetimeW_BasicWageW_BasicWagemoneyW_BoonW_BoonmoneyW_BonusW_BonusmoneyW_FactWageW_FactWagemoney四、系统实现根据前面的分析和设计,使用以下开发平台组合,部分完成了系统的实现。系统:Windows;语言:Java ;数据库: SQL Server 2000;平台:MyEclipse。系统的截图已经在第三部分的界面设计中展现出来,以下是部分关键代码。其中,窗口布局实现部分就不在贴出,仅贴出部分窗口中的功能实现代码。详细代码见软件包。/Database.java 数据库类,实现数据库的连接和操作。package classsource;import java.sql.*;public class Database public static Connection cn; public static Statement st; public static ResultSet rs; public static boolean joinDB() boolean joinFlag; try Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); cn = DriverManager.getConnection("jdbc:odbc:EmployeeInformationMS","sa",""); cn.setCatalog("EmployeeInformationMS"); st = cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); joinFlag = true; return joinFlag; catch (SQLException sqlEx) System.out.println(sqlEx.getMessage(); joinFlag = false; return joinFlag; catch (ClassNotFoundException notfoundEX) System.out.println(notfoundEX.getMessage(); joinFlag = false; return joinFlag; public static boolean executeSQL(String sqlString) boolean executeFlag; try st.execute(sqlString); executeFlag = true; catch (Exception e) executeFlag = false; System.out.println("sql exception:" + e.getMessage(); return executeFlag; public static boolean query(String sqlString) /select 语句 try rs = null; /System.out.println(sqlString); rs = st.executeQuery(sqlString); catch (Exception Ex) System.out.println("sql exception:" + Ex); return false; return true; /Land.java 登录类的部分代码 private void Judge(String sqlString) /用户名及密码验证 if (Database.joinDB() if (Database.query(sqlString) try if(Database.rs.isBeforeFirst() /System.out.println("密码正确"); jf.setVisible(false); /关闭数据库连接 D.close(); new Main(textName.getText(); else /System.out.println("错误"); JOptionPane.showMessageDialog(null,"用户名或密码错误!","",JOptionPane.ERROR_MESSAGE);/! catch(Exception ex) JOptionPane.showMessageDialog(null,ex.getMessage(),"",JOptionPane.ERROR_MESSAGE); else JOptionPane.showMessageDialog(null,"连接数据库失败!","",JOptionPane.ERROR_MESSAGE); /Main.java 主窗口部分代码/实例化系统管理菜单的菜单项JMenuItem password = new JMenuItem("密码修改");password.setFont(f);JMenuItem land = new JMenuItem("重新登陆");land.setFont(f);JMenuItem addDelete = new JMenuItem("添加/删除用户");addDelete.setFont(f);JMenuItem exit = new JMenuItem("退出系统");exit.setFont(f);systemM.add(password);systemM.add(land);systemM.add(addDelete);systemM.add(exit);/实例化系统管理菜单的菜单项结束/为系统管理菜单加事件- password.addActionListener(new ActionListener()/密码修改监听 public void actionPerformed(ActionEvent e) deskpane.add(new AmendPassword(); ); land.addActionListener(new ActionListener()/重新登陆监听 public void actionPerformed(ActionEvent e) setVisible(false); new Land(); ); addDelete.addActionListener(new ActionListener()/添加/删除用户监听 public void actionPerformed(ActionEvent e) deskpane.add(new AddDeleteUser(); ); exit.addActionListener(new ActionListener()/退出系统监听 public void actionPerformed(ActionEvent e) setVisible(false); );/DepartmentInformation.java 以下几个方法分别是为部门管理中的“下一条”、“上一条”、“添加”、“删除”、“修改”、“保存”等功能的实现。public void next()/下一条记录 try if(!Database.rs.isLast() && Database.rs.next() number=("" + Database.rs.getInt("D_Number"); name=Database.rs.getString("D_Name"); count=Database.rs.getString("D_Count"); tnumber.setEditable(true); tnumber.setText(number); tname.setText(name); tcount.setText(count); catch(Exception el) System.out.println(el); public void previous()/上一条记录 try if(!Database.rs.isFirst() &&Database.rs.previous() number=("" + Database.rs.getInt("D_Number"); name=Database.rs.getString("D_Name"); count=Database.rs.getString("D_Count"); tnumber.setEditable(true); tnumber.setText(number); tname.setText(name); tcount.setText(count); catch(Exception er) System.out.println(er); public void AddDepartment() /添加员工 if(tname.getText().equals("") | tcount.getText().equals("") JOptionPane.showMessageDialog(null,"部门名和部门人数都不能为空!"); else name=tname.getText(); count=tcount.getText(); String sInsert = "insert DepartmentInformation values('"+ name +"','"+ count +"')" try if(Database.executeSQL(sInsert) tnumber.setEditable(true); btsave.setEnabled(false); JOptionPane.showMessageDialog(null,"添加数据成功!"); Database.joinDB(); String sql="select * from DepartmentInformation" Database.query(sql); Database.rs.last(); number=("" + Database.rs.getInt("D_Number"); tnumber.setText(number); else JOptionPane.showMessageDialog(null,"添加数据不成功!");