《田径运动会管理系统(共21页).doc》由会员分享,可在线阅读,更多相关《田径运动会管理系统(共21页).doc(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上分类号 编 号 华北水利水电大学 North China Institute of Water Conservancy and Hydroelectric Power 课 程 设 计题目 田径运动会管理信息系统 学 院 信息工程学院 专 业 计算机科学与技术 小组成员1 严晶() 小组成员2 张伟健() 小组成员3 张浩() 小组成员4 张富源()指 导 教 师 王合闯 2014年 12 月 6 日华北水利水电大学 软件工程 课程设计报告20132014学年 第 一 学期 2010级 计算机科学与技术 专业小组成员1:严晶() 分工: 需求分析和数据库创建 小组成员2
2、:张伟健() 分工: 系统人员管理模块 小组成员3:张浩() 分工: 运动员成绩管理模 小组成员4:张富源() 分工: 运动员管理模块 一系统描述 本系统采用软件工程原理,使用面向对象的Java编程环境编写校级运动会管理系统,利用MYSQL数据库技术,对数据库进行了全面的开发。系统主要包括前台应用程序的开发以及后台数据库的建立和维护两个方面,实现了运动员成绩数据库的创建及运动员成绩的输入、统计、浏览和维护,使得系统具有界面友好,功能强大,易于维护的特点。本校级运动会管理系统在功能实现方面主要分为以下几点:1) 运动员个人信息管理模块。运动员管理与普通的用户管理基本类似,包括用户的添加、修改、编
3、辑和删除功能,参赛项目的维护。例如有的运动员临时因伤不能参寒,有的又调整为可以参加某个项目(虽然严格说来,不允许运动员临时更改参赛项目,但需要在系统中留有余地)。2) 运动员成绩管理模块。操作员可以对成绩进行录入,一旦提交则只能查看不能修改管理员可以查看成绩并调整成绩,因为前场工作人员可能犯错,需要管理员进行更改,但日志中要对此更改进行记录。运动员可以通过终端查看运动成绩。3) 权限管理模块。管理员可以对操作人员进行信息维护,如增加前场成绩录入人员,或者某位成绩录入人员调离岗位则取消其权限。对于运动员可以匿名查询某个项目的成绩。综合以上情况,设计系统体系结构如图1所示。 应用层 模块 代理层
4、数据库接口层 图1 应用层提供诸如GUI的显示、事件的处理等;代理层是分离上层和具体数据库访问层的,也可以称为业条层,这样的目的是当数据库发生变更时,可以将程序的改动缩减到最小。数据库接口层是与具体的数据库进行交互,对数据进行提取、存入操作。模块包是与数据库实体相对应的类定义,也可以说与数据库中的每条记录相对应。二详细设计 1、模块功能 1.1、系统人员管理模块 该模块实现系统人员的添加、修改、查询和删除,先在数据库中添加管理员帐户。管理员在用户管理方面拥有一切权限,而普通用户只有修改个人密码、查询个人信息、运动会比赛信息、比赛成绩及获奖情况的权限。如图2所示。 系统人员管理模块系统操作员信息
5、的输入系统操作员信息的修改系统操作员信息的删除系统操作员信息的查询 图2 1.2、运动员管理模块 该模块由管理员对运动员个人信息的录入、修改及删除功能。普通用户可以实现对运动员个人信息的查询功能。其功能层次如图3所示。 运动员管理模块运动员信息的输入运动员信息的修改运动员信息的删除运动员信息的查询 图3 1.3、运动员成绩管理模块 该模块实现管理员录入运动员的成绩、查询成绩、修改成绩删除查询到的成绩信息以及普通用户查询成绩。其功能层次图如图4所示。 运动员成绩管理模块运动员成绩的输入运动员成绩的修改运动员成绩的删除运动员成绩的查询 图42、 数据库结构设计 表1 运动会项目表(SportIte
6、ms)列名数据类型可否为空说明ItemIdVARCHAR(20)NOT NULL体育项目编号ItemNameVARCHAR(50)NOT NULL项目名称ItemTypeVARCHAR(50)所属的运动类别voidVARCHAR(1)是否有效 表2 运动员参赛项目表(ItemAttend)列名数据类型可否为空说明SportorIdVARCHAR(20)NOT NULL运动员编号ItemIdVARCHAR(20)NOT NULL体育项目编号ScoreVARCHAR(50)成绩voidVARCHAR(1)本条记录是否有效表3 运动员个人信息表(Sportor)列名数据类型可否为空说明Sportor
7、IdVARCHAR(20)NOT NULL运动员编号NameVARCHAR(50)NOT NULL运动员名称GenderVARCHAR(1)性别。M男,F女WeightFLOAT体重,单位KgHeigthFLOAT身高,单位cmAgeINT年龄GradeINT等级voidVARCHAR(1)是否参赛标志。Y为无效,已经被删除。N为有效,参加本次比赛表4 系统用户信息(SysUser)列名数据类型可否为空说明SysUserIdVARCHAR(20)NOT NULL系统用户的编号NameVARCHAR(20)NOT NULL姓名PasswordVARCHAR(50)NOT NULL密码Gender
8、VARCHAR(1)性别RoleIdVARCHAR(20)所属于的角色voidVARCHAR(1)用户是否有效表5 系统用户角色(Roles)列名数据类型可否为空说明RoleIdVARCHAR(20)NOT NULL角色编号RoleNameVARCHAR(50)角色名称voidVARCHAR(1)是否生效 3、界面及代码设计 3.1、登录子系统开发 由于每个系统中都涉及登录子系统,因此在这里并不进行过多介绍,只提供一个登录子系统的框架,登录成功后程序的流程应根据登录用户的身份来区别对待。登录系统的界面如图5所示。 图5当用户输入用户名、密码和登录身份后,会通过RoleAccessProxy类进
9、行底层访问,查看用户登录信息是否正确! 3.2、系统用户管理模块 系统用户管理模块是实现对本系统中的操作人员管理人员的权限分配、个人信息修改、密码设定、删除等功能,其运行界面如图6所示。 图6系统用户管理的界面相对复杂一些,其中最左边是一个列表框,用来显示列表式的数据,在这里就是本系统中的用户。右侧面板主要是当选中左侧列表中的某个用户时显示该用户的对应信息,可以对用户数据进行编辑、删除等操作。单击“更新用户”按妞,则触发相应事件,调用SysUserProxy类实现更新操作。与登录子系统中的RoleAccessProxy类相类似,SysUserProxy也是对数据访问进行了封包,使上层应用无须与
10、底层直接接。这样增强了系统的可移植性和可扩展性。关于SysUserProxy类的代码在此处省略。3.3、运动员信息管理模块 运动员信息管理模块主要实现对人员个人信息的维护,其界面布局与系统用户管理模块类似,如图7所示。 图7 3.4、运动员成绩管理模块 这一功能模块在结构上采用三级连动方式,即一级菜单的动作触发二级菜单的响应,二级菜单的动作影响三级菜单的显示。基于这个依据,设计界面如图8所示。 图8仔细阅读前面的代码,其实逻辑并不复杂,主要是当鼠标选中左边的一项时,会触发相应的事件,从数据库中提取相应的数据填充中间的列表框,当中间的列表框有数据被选中时,则将相关的数据显示在最右边的面板上。另外
11、,在这个系统的各个层次中,需要使用到一些输助类,这些类与具体的对象相关联。例如表示运动员实体的类SportsMan,其与数据库的记录一一对应。这样便于在类与数据之间实现自由转换。有关于这些辅助类的代码就不一一列出了!三心得体会在我们整个软件工程过程中,我体会到了许多,也学到了许多。需求调研和分析对于软件开发过程至关重要。我们在开发时如果不进行调研和分析,那么对于后来的项目进展将产生致命的后果。我们在项目的开发中便遇到了这样的问题。我们开始自己随意的计划整个系统的设计,然后报给老师,老师作为一个客户并不是全部认同,随后我们也必须按着客户的要求更改我们的设计报告。我也明白了,再做一个系统时,必须随
12、时和客户保持沟通,随时了解他们需要什么,他们想要什么功能。如果我们不去和客户沟通,不去调研客户的需求,做出来的系统即使在我们看来是一个很好,很完美的产品,但是如果客户不认同,那么我们所做的一切都是徒劳,还要返工去修改,费时费力。所以在做任何一个项目时,前期的需求调研和需求分析都是必须的,这是在做一个项目的基本,是关系成败的重要一环。对于一个项目,它的需求设计也非常重要。在我们的开发的过程中,遇到了一些问题,出现的这些问题很多都是非常棘手的,我们为了解决这些棘手的问题浪费了大量的时间,我们不得不在工程代码上改了又改,在数据库里增表、删表、加数据、减数据,当然,在文档里也要做出相应的修改以适应新的
13、功能。还好,我们能及时地发现问题,通过相互沟通讨论,问题也得到了解决。通过总结,我们也意识到,我们大家在做需求分析和进行需求了解时仅仅考虑了一些基本的功能,而至于管理员和客户之间的联系,以及具体的一些流程我们都没有深究,而导致我们到后期花费了大量的时间用于修复之前没有考虑周全而带来的问题。如果我们的需求设计能够比较清晰和完善,那么我们在开发过程中便会很明白的知道我们应该实现什么样的功能,在数据库里应该怎样建表,以什么方式插入数据,从而可以避免反复修改工程的问题,也能避免出现可能毁坏整个工程的问题。整个工程的需求设计对于一个项目的顺利进展至关重要。对于文档在软件工程中的作用,我在这次项目开发过程
14、中有了更加深刻的理解。文档在软件开发过程中是很有用的,文档是一项必不可少的东西,但文档也不能太多,太过繁琐,如果是那样就不太好了。首先我们要明确开发过程中为什么要写这些文档,文档的最根本的作用是为了更好的沟通。一个项目或产品可能需要延续很长的时间,开发过程中可能需要很多的环节,可能会遇到很多的问题和很多的解决的方法,这时,我们需要文档的帮助,我们需要有一个东西来记录,我们需要有一个共同的声音。文档只不过是一个准绳,将开发中的各个树枝树叶扶正。如果,这个准绳太多太紧,大树可能会发育的很高很直,但是就是有些畸形,如果这个准绳太少太松,大树可能就会变成灌木丛。文档的多少、繁简是有度的,绝对不能说越多
15、越好。我觉得,文档需要说明解决问题的方法而不是解决问题的理论,因为解决问题的理论是在文档形成中做到的。文档完整即可,每一份文档说明一个问题,无需将多个文档的内容放在一个文档的里面。除了重要阶段形成文档,其它部分都只是讨论或者说是想法。不要让文档成为累赘,如果真是这样,我认为就是该考虑写这些文档的必要性的时候了。我们在文档的时候,一定要明白为什么要写这些。在整个项目开发过程中,我们也同时遇到了许多程序接口问题,页面和功能相结合的问题,数据库建表的问题,这些问题都是源于我们项目小组成员之间的沟通不足。我深刻认识到,在项目开发时,项目小组中各个成员之间的相互沟通是非常重要的。如果我们要在功能方面作出
16、修改,那么程序人员和页面人员及数据库人员就必须相互沟通,共同对整个程序作出相应的修改,这样才能避免最终整合时出现问题。在这几周里,我还对软件工程有了新的理解。在我以前的理解当中,软件工程,无非就是一个人或者几个人或一个团队集中在一起进行编写代码的工作,以实现开发出所用的软件。但现在我明白了,软件工程的作用,就是告诉人们怎样去开发软件和管理软件。具体地讲,它表现在与软件开发和管理有关的人员和过程上。所以,软件工程就不仅仅是单一的编程过程了。它包括了系统分析-建模-概要设计-详细设计-编码-测试-维护。编码可以理解为编程,这个只占总时间的20左右。编程只是其中的一小部分。在这次项目里我完成了许多工
17、作,全部的用户页面及部分管理员页面的制作,在后期项目整合过程中修改了功能和界面结合时出现的bug,还有数据库插入数据及解决数据库集中整合时出现的问题。这些工作我都顺利完成了,虽然并不能算是非常的出色,但也算是尽力了。现在看到自己辛劳的成果,我感到很欣慰。附件:public static void main(String args) / TODO Auto-generated method stub/*根据需要,打开下面运行开关*/*主登录窗口界面StartApp mainForm = new StartApp();mainForm.InitUI();*/运动员管理模块/new SportorM
18、anagement();/运动员成绩管理模块new SportorScoreManagement();/系统人员管理模块 new SysUserManagement();/public class LoginEvtHandle implements ActionListenerpublic void actionPerformed(ActionEvent e)tryif( (JButton)e.getSource() = jbtLogin )/根据用户登录身份,转向对应的界面String UserName = jtxtUser.getText().trim();String Password
19、= jtxtPass.getText().toString();EnumRole role = UserRole.getUserRole( jcmbIdentify.getSelectedItem().toString().trim() );System.out.println(UserName: + UserName + Password: +Password + + Role : + role);if( role = EnumRole.NOROLE )JOptionPane.showMessageDialog(null,用户角色未设定,请单击匿名登录访问系统!,错误,JOptionPane
20、.ERROR_MESSAGE);return;else if( role = EnumRole.NOTSUPPORT )JOptionPane.showMessageDialog(null,用户角色不支持,请联系管理员!,错误,JOptionPane.ERROR_MESSAGE);return;else if( role = EnumRole.SYSADMINISTRATOR )/连接数据库,验证是否管理人员RoleAccessProxy roleProxy = new RoleAccessProxy();if( roleProxy.ValidateUserExist(UserName,Pas
21、sword,RoleIdMapRoleName.SYSADMIN) = true )JOptionPane.showMessageDialog(null,登录成功!,正确,JOptionPane.INFORMATION_MESSAGE);elseJOptionPane.showMessageDialog(null,用户角色不支持,请联系管理员!,错误,JOptionPane.ERROR_MESSAGE);System.exit( - 1 );else if( role = EnumRole.SYSOPERATOR )/连接数据库,验证是否系统操作人员并转到相应界面RoleAccessProxy
22、 roleProxy = new RoleAccessProxy();if( roleProxy.ValidateUserExist(UserName,Password,RoleIdMapRoleName.SYSOPERATOR) = true )JOptionPane.showMessageDialog(null,登录成功!,正确,JOptionPane.INFORMATION_MESSAGE);elseJOptionPane.showMessageDialog(null,用户角色不支持,请联系管理员!,错误,JOptionPane.ERROR_MESSAGE);return;elseJOp
23、tionPane.showMessageDialog(null,发生未知错误!,错误,JOptionPane.ERROR_MESSAGE );return;else if( (JButton)e.getSource() = jbtAnonymous )System.out.println(Anonymous);elseSystem.out.println(Unsupported!);catch(Exception ex)System.out.println(Unknow Exception: + ex.getMessage() );else if(e.getSource() = (JButto
24、n)btnDelUser)String userId = txtUserId.getText();String finalSql = DELETEFROM sportor WHERE SPORTORID=+userId+;SportorProxy UserProxy = new SportorProxy(); UserProxy.UpdateUserById(finalSql);lstUserList.removeAll();InitCtlData();JOptionPane.showMessageDialog(null,删除成功!,成功,JOptionPane.INFORMATION_MES
25、SAGE);return;UserProxy .UpdateUserById(finalSql);JOptionPane.showMessageDialog(null,更新成功!,成功,JOptionPane.INFORMATION_MESSAGE);return;class UserOperAction implements ActionListenerpublic void actionPerformed(ActionEvent e)if( e.getSource() = (JButton)btnAddUser )/增加系统用户/*课后作业*/JOptionPane.showMessage
26、Dialog(null,新增成功!,成功,JOptionPane.INFORMATION_MESSAGE);return;else if( e.getSource() = (JButton)btnUpdateUser )/更新现有用户String userId = txtUserId.getText();String userName = txtUserName.getText();String Gender;if( cmbGender.getSelectedItem().toString().equals(男)Gender = M;elseGender = F;float weight =
27、0.0f;if( txtUserWeight.getText() != null & txtUserWeight.getText() != )weight = Float.parseFloat(txtUserWeight.getText();float height = 0.0f;if( txtUserHeight.getText() != null & txtUserHeight.getText() != )height = Float.parseFloat( txtUserHeight.getText() );int age = 0;if( txtUserAge.getText() !=
28、null & txtUserAge.getText() != )age = Integer.parseInt( txtUserAge.getText() );int grade = 0;if( txtUserGrade.getText() != null & txtUserGrade.getText() != )grade = Integer.parseInt( txtUserGrade.getText() );String Void;if( chkSysUserVoid.isSelected() = true)Void = Y;elseVoid = N;String finalSql = ;
29、 finalSql = UPDATE sportor + SET NAME= + userName +,GENDER=+Gender + , + WEIGHT= + weight + , HEIGHT = + height + , + AGE = + age +, + GRADE = + grade + ,VOID= + Void + +WHERE SPORTORID=+ userId + ; SportorProxy UserProxy = new SportorProxy(); SysUserProxy sysUserProxy = new SysUserProxy(); vecSysUs
30、ers = sysUserProxy.getAllSysUsers();trysysUserProxy.closeDbConnection();catch(SQLException ex)for( int i = 0; i vecSysUsers.size(); i + )lstUserList.add(SysUser)vecSysUsers.elementAt(i).getName() + + (SysUser)vecSysUsers.elementAt(i).getSysUserId();/*为控件注册事件*/this.lstUserList.addItemListener( new Li
31、stItemChange() );UserOperAction btnEvtHandle = new UserOperAction();this.btnDelSysUser.addActionListener(btnEvtHandle);this.btnUpdateUser.addActionListener(btnEvtHandle);class ListItemChange implements ItemListenerpublic void itemStateChanged(ItemEvent e)java.awt.List lstCtrl = (java.awt.List)e.getS
32、ource();String str = lstCtrl.getSelectedItem();if( str = null | str = )return;String result = str.split(s); /分解成TokenString sysUserId = result2;SysUserProxy sysUserProxy = new SysUserProxy();SysUser instanceSysUser = sysUserProxy.getUserById(sysUserId);txtSysUserId.setText( instanceSysUser.getSysUse
33、rId() );txtSysUserName.setText( instanceSysUser.getName() );if( instanceSysUser.getGender().equals( M) )cmbGender.setSelectedIndex(0);else if( instanceSysUser.getGender().equals(F)cmbGender.setSelectedIndex(1);txtSysUserPassword.setText( instanceSysUser.getPassword() );txtRetrySysUserPassword.setTex
34、t( instanceSysUser.getPassword() );if( instanceSysUser.getRoleId().equals(RoleIdMapRoleName.SYSADMIN )cmbSysUserRole.setSelectedIndex(0);else if(instanceSysUser.getRoleId().equals(RoleIdMapRoleName.SYSOPERATOR) )cmbSysUserRole.setSelectedIndex(1);elsecmbSysUserRole.setSelectedIndex(2);if( instanceSy
35、sUser.getVoid().equals(Y)chkSysUserVoid.setSelected(true);elsechkSysUserVoid.setSelected(false);trysysUserProxy.closeDbConnection();catch(SQLException ex)class UserOperAction implements ActionListenerpublic void actionPerformed(ActionEvent e)if( e.getSource() = (JButton)btnDelSysUser )/删除系统用户String
36、userId = txtSysUserId.getText();String finalSql = DELETEFROM SysUser WHERE SYSUSERID=+userId+;SysUserProxy sysUserProxy = new SysUserProxy(); sysUserProxy.UpdateUserById(finalSql);JOptionPane.showMessageDialog(null,删除成功!,成功,JOptionPane.INFORMATION_MESSAGE);else if( e.getSource() = (JButton)btnUpdate
37、User )/更新现有用户String userId = txtSysUserId.getText();String userName = txtSysUserName.getText();String Gender;if( cmbGender.getSelectedItem().toString().equals(男)Gender = M;elseGender = F;String Pass;if( txtSysUserPassword.getText().equals(txtRetrySysUserPassword.getText() )Pass = txtSysUserPassword.
38、getText();elseJOptionPane.showMessageDialog(null,密码不匹配,错误,JOptionPane.ERROR_MESSAGE);return;String userRole;if( cmbSysUserRole.getSelectedItem().toString().equals(系统管理员)userRole = RoleIdMapRoleName.SYSADMIN;else if(cmbSysUserRole.getSelectedItem().toString().equals(系统操作员) )userRole = RoleIdMapRoleNa
39、me.SYSOPERATOR;elseuserRole = ;String Void;if( chkSysUserVoid.isSelected() = true)Void = Y;elseVoid = N;String finalSql = UPDATE SYSUSER SET NAME= + userName + , +PASSWORD = + Pass + , GENDER= + Gender + , +ROLEID= + userRole + , VOID= + Void + WHERE +SYSUSERID= + userId + ;SysUserProxy sysUserProxy = new SysUserProxy(); sysUserProxy.UpdateUserById(finalSql);JOptionPane.showMessageDialog(null,更新成功!,成功,JOptionPane.INFORMATION_MESSAGE);RoleAcessProxy roleProxy=new RoleAccessProxy();If(roleProxy.ValidateUserExist(UserName,Password,RoleIdMapRoleName.SYSADMIN)=true) JOptionP
限制150内