1、毕业设计本 科 毕 业 论 文 题 目: 企业工资管理系统的设计与实现 姓 名: 学 号: 专 业: 计算机科学与技术 教学站点: 入学时间: 指导教师: 网络教育学院制年 月 日指导教师评语: 指导教师(签字) 答辩小组意见: 组 长(签字) 成 绩: 学院(盖章) 年 月 日摘要本文从用计算机实现企业工资管理的角度出发,系统地介绍了为某企业设计的一套网络环境的工资软件。本文详细叙述了系统的功能、数据结构、概要设计、详细设计。系统实现了职工信息、工资的录入、查询和修改,用户管理等功能。系统的特点是采用B/S架构,整个系统的管理工作都集中在服务器端,运用多层软件架构确保了系统的扩展性和适用性。
2、关键字:工资管理系统,mysqlserver,tomcat7.0AbstractThis treatise bases on the managing of wage by computer and generally introduces a kind of wage managing software about internet environment for a certain university. It discusses the functions of the system, data structure, summary designing and particular de
3、signing in detials. The system implements the insert query of the employees information and wage, the reports ,user management and so on. The specialty of the system is using B/S structure. The management of the system focus on the server. It uses several layers software structure to insure the appl
4、icability and the expansibility of the system. The server is mostly using servlets and, the client is jsp.Key Words:The management system of wage, the java stored procedure of oracle,the module of wage calculoation 目录摘要3第一章 绪论71.1 背景71.2 开发工具和运行环境的选择71.3 本文所做的工作8第二章 需求分析92.1 用户功能的需求分析92.1.1 具体需求92.1
5、.2 系统维护92.2 功能划分92.3 数据采集92.5 数据库设计9第三章 概要设计113.1总体设计113.1.1基本概念设计113.1.2开发环境113.1.3软件结构11第四章 详细设计144.1 登陆窗口设计144.1.1 功能说明144.1.2 实现方法144.2 主界面154.2.1 功能说明154.2.2 实现方法154.3职工信息录入154.3.1 功能说明164.3.2 实现方法164.4 职工信息的查询和修改164.4.1 功能说明164.4.2 实现方法174.5 部门信息的管理174.5.1 功能说明174.5.2 实现方法174.6 职工工资信息的导入174.6.
6、1 功能说明184.6.2 实现方法184.7 职工工资信息查看184.7.1 功能说明194.7.2 实现方法194.8 用户角色的创建及授权194.8.1 功能说明204.8.2 实现方法204.9 权限菜单的配置214.9.1 功能说明214.9.2 实现方法214.10 日志管理214.10.1214.10.2224.11 过滤器和监听器224.11.1 是否登陆过滤器224.11.2 编码过滤器224.11.3 用户监听器22第五章 毕业设计小结245.1目标完成情况和不足245.2 项目展望24致谢26参考文献27附录28附录一 数据库表的结构28附录二 源代码321.监听器(日志
7、生成)322.过滤器38第一章 绪论1.1 背景随着计算机技术的飞速发展,计算机在企业中应用的普及,利用计算机实现人事工资的管理势在必行。利用计算机支持企业高效率完成劳动人事管理的日常事务,是适应现代企业制度要求、推动企业劳动人事管理走向科学化、规范化的必要条件;而工资管理是一项琐碎、复杂而又十分细致的工作,工资计算、发放、核算的工作量很大,一般不允许出错,如果实行手工操作,每月发放工资须手工填制大量的表格,这就会耗费工作人员大量的时间和精力,计算机进行工资发放工作,不仅能够保证工资核算准确无误、快速输出,而且还可以利用计算机对有关工资的各种信息进行统计,服务于财务部门其他方面的核算和财务处理
8、,同时计算机具有手工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高人事工资管理的效率,也是企业的科学化、正规化管理与世界接轨的重要条件。不同的企业具有不同的人事、工资管理制度,这就决定了不同的企业需要不同的人事工资管理系统。该企业以前的所有资料都是用人工来进行管理的,面对目前的实际状况,迫切需要开发一个新系统来适应这一些工作。1.2 开发工具和运行环境的选择本系统采用b/s结构,即Brower-Server(浏览器-服务器)架构,B/S 结构是目前最流行的数据库应用模式, 它解决了各种分布式应用, 扩展了业务范围;在B/S
9、 结构下,整个系统的管理、资源分配、 数据库操作、 业务逻辑部件的管理及动态加载等工作集中用服务器,容易部署和管理。由于整个系统使用了B/S架构,在客户端使用标准的Web页面浏览器(如Internet Explorer等),不需安装特殊的应用程序,减少了升级和维护的难度,所有的业务数据都保存在服务器(Server)端,确保了业务的安全;在通讯方面,由于使用的是标准的Http协议,使得系统可以轻松的实现移动办公和分布式管理,同时,为系统与电子商务的整合与扩展打下了坚实的技术基础。灵活的系统体系结构,以及对Internet技术的充分运用,保证了业务逻辑、界面表示的独立,使系统具有高可用性、可伸缩性
10、和易扩展性。B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。客户机上只要安装一个浏览器(Browser),如NetscapeNavigator或InternetExplorer,服务器安装Oracle、Sybase、Informix或SQLServer等数据库。浏览器通过WebServer同数据库进行数据交互。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。1.3
11、本文所做的工作第一章绪论部分绪论主要叙述课题提出背景、目前应用现状、分析比较当前开发工具,运用的技术。第二章结合软件工程方法,对系统进行需求分析、功能划分、数据流图设计,并结合数据库原理和功能划分进行数据库结构设计。第三章概要设计,介绍了软件的总体设计和数据结构的设计。第四章根据需求分析的结果,对系统进行详细设计,主要介绍每一个模块的具体功能和实现方法。第四章毕业设计小结,总结部分介绍了系统设计中的不足和改进的方向,项目的展望第二章 需求分析2.1 用户功能的需求分析2.1.1 具体需求提供各项数据的录入,修改,查询功能。包括部门信息,职工信息,工资的发放标准;自动生成每月的应发工资,由操作人
12、员填入各项代扣代缴费用后,自动生成实发工资。2.1.2 系统维护提供简单的用户管理的功能,增加,删除用户,设置,修改用户口令。为了兼顾安全性和方便性,在用户管理上针对不同的角色,实现不同的操作权限。2.2 功能划分根据需求分析,将系统划分为5个功能模块,分别为用户登陆,系统管理,数据录入,数据查询,用户管理。2.3 数据采集1数据来源 数据主要来源于职工,即职工是数据源,职工的基本信息,职务信息,可视登记表等作为数据源输入。2数据出路 主要是反馈给各各部门领导,职工个人等2.5 数据库设计1 表和和视图描述表格描述表格名称具体描述用户表SYS_USER用于记录职工个人信息部门表SYS_DEPT
13、系统已建角色表SYS_ROLE系统已建权限表SYS_RES系统已建用户角色表SYS_USER_ROLE系统已建角色权限表SYS_ROLE_RES系统已建工资表USER_WAGES用于记录职工工资表2-1 表和视图表2.表之间关系 图2-7 表关系图第三章 概要设计3.1总体设计3.1.1基本概念设计本软件是基于web的工资管理系统,开发结构为数据库/应用服务器/客户端的三层结构,即数据层/逻辑层/表示层,系统在J2EE平台上实现;考虑到实际情况,本系统的用户可能是财务管理者,也可能是普通职员,为了兼顾安全性和方便性,在用户管理上针对不同的角色,实现不同的操作权限。3.1.2开发环境数据库服务器
14、使用Oracle9i,客户端统一使用Web浏览器,向应用服务器的HTTP端口发请求。配置对象软件要求硬件要求网络环境内部局域网应用服务器Tomcat7.04G内存 100G硬盘数据库服务器Oracle11g4G内存100G硬盘数据库开发平台Windows开发工具MyEclipsePL/SQL DeveloperIE浏览器4G内存100G硬盘表3-1 开发环境表3.1.3系统结构系统的结构图如下所示 图3-1 系统结构图图3-1为管理员所能操作的功能,普通用户只能查看其中的数据查询和登录注销模块。功能需求与模块的关系序号模块简称/简称模块名需求简要描述1LOGIN用户登录根据登录的用户角色,显示
15、不同的菜单项,限制普通用户的权限。2QUIT退出系统阻止用户非正常退出系统,将用户保存在web应用服务器上的所有session删除。3ROLE用户角色根据不同的用户角色,动态构造不同的菜单项目。4M_USER用户管理管理除自己外的所有用户,包括删除,添加和修改,普通用户要使用该系统,必须由管理员创建登录名和密码。5CHANGE_PASSWORD密码更改用户更改自己的密码6VALIDATIOON数据有效性校验(通用模块)通过给需要校验的表单元素增加扩展属性,就可以完成客户端表单数据的校验。校验会给出合理的提示信息,并自动定位到不合理数据元素。7DEPT_OPER部门信息维护部门信息的输入与修改。
16、8USER_OPER职工信息维护职工信息的输入与修改。9PAY_OPER工资标准信息维护工资标准的输入与修改。10QUERY_DEPT部门信息查询查询部门信息,并可操作数据。11QUERY_TEACHER职工信息查询查询教师信息,并可操作数据。12QUERY_PAY工资标准查询查询工资标准,并可操作数据。13SUM_PAY统计工资按部门统计各项数据。可按部门查询和个人查询,并统计各个部门的数据。表3-2 功能需求和模块表第四章 详细设计4.1 登陆窗口设计图4-1 登录窗口界面4.1.1 功能说明工资管理系统第一个界面就是用户登录界面,该界面是用户想要登录本系统必须有的步骤,该界面登录时用户受
17、权限限制,有管理员登陆和员工登陆。员工登录时只有里面各项的查询功能。管理员则有对里面各项的一切操作功能。如果用户名或密码输入错误会出相应的提示信息。用户信息的验证。要求输入用户名和密码,并检查用户名和密码的正确性。如果正确,则设定用户的使用权限,进入系统的主界面;如果错误,则提示用户继续输入,直到退出系统为止。4.1.2 实现方法首先链接数据库,要求用户输入用户名和密码 ,点击登陆,则读取用户表users,把用户输入的信息与用户表中的信息进行比较,如果正确,则进一步读取用户的使用权限到session里的username和scope,同时打开主界面;否则,给出提示信息重新进入登陆界面。4.2 主
18、界面图4-2 主界面4.2.1 功能说明用户操作的主界面,左边是功能菜单,列出了当前用户具有功能选项。右边是主界面,具体的操作都在主界面实现4.2.2 实现方法主界面有三个框架组成。分别为title,menu,main。Tile中主要是系统名称,menu主要是一些功能按钮。如职工信息录入,查询,修改;工资信息的查询录入和修改,报表生成等功能。这些功能是随着用户的权限的变化而动态变化的。如一般用户进入后就只有查询功能,没有录入的功能。点击menu里的功能按钮后,在main框架中就会出现这个功能的具体操作,下面将详细介绍各个功能。4.3职工信息录入图4-3 职工信息录入界面4.3.1 功能说明实现
19、职工的统一管理,进行职工信息的录入工作。4.3.2 实现方法用户录入各项信息后,进行客户端验证(JavaScipt),例如职工编号不能为空,出生日期不能有字母等。为了增强程序的健壮性,客户端有可能禁用javascipt,所以在服务器端最好也加上相同的验证。经过验证以后合法的职工信息,将被存储在数据库中,存储成功后给出提示信息,并返回录入界面,如果存储失败,返回出错界面,给出提示信息。新增时信息为:用户登录名、用户密码、用户名称、用户部门(通过下拉菜单选择部门)、性别、年龄、身份证号码。4.4 职工信息的查询和修改4.4.1 功能说明给出检索条件(姓名,部门等),检索出职工的简要信息,点击查看后
20、,给出职工的详细信息。点击更改后,进入更改界面4.4.2 实现方法查询条件,可以列出职工的所有信息,供检索,或者只列出职工主要信息,如姓名,部门等。通过选中的信息主键,在后台程序中获取该数据的详细信息,并通过将信息返回到弹出框页面中,对主要信息进行修改操作。修改时信息为:用户密码、用户名称、用户部门(通过下拉菜单选择部门)、性别(通过下拉菜单选择部门)、年龄4.5 部门信息的管理4.5.1 功能说明部门管理部门的功能有查询部门信息、添加部门信息、修改部门信息、删除部门信息等,实现了部门的统一管理。4.5.2 实现方法通过点击新增按钮实现对部门的基本信息(部门名称、部门说明、部门领导)等录入操作
21、,在后台代码中获取创建人(系统操作用户)、创建时间(系统功能操作时间)、以及创建的状态(默认新增、修改为有效状态:STATE = 1,删除操作时状态置为无效:STATE=0)等信息,点击保存按钮,将信息保存到数据库中。4.6 职工工资信息的导入 图4-6工资导入4.6.1 功能说明为了减轻每个月对工资信息的手动录入工作,系统实现了工资批量导入功能。系统管理员按照工资导入EXCLE模板,对工资信息整理到EXCEL表格中,使用此功能进行每月的工资批量入库工作,大大减轻了人力劳动,提高工作效率。4.6.2 实现方法按照格式输入需要导入的年份和月份,选择需要导入的工资信息EXCEL(模板为固定格式),
22、点击提交按钮,后台程序会批量导入导入工资信息。4.7 职工工资信息查看图4-7 工资信息查看界面4.7.1 功能说明职工工资信息查看功能主要实现了管理员对全部工资信息的统一管理以及用户对自己的工资信息的明细查看。通过此功能可以约束职工工资的保密性,同时又对职工的工资有电子留档。4.7.2 实现方法根据登陆用户的角色判断用户是普通用户还是工资管理员,如果是普通用户则可以查看到本月的工资明细,也可通过查询功能按照年份月份查询以前的工资记录;如果为工资管理员则可以查看到本公司的所有的人的本月的工资明细,并可以通过查询功能按照用户、时间字段查询具体用户的具体时间的工资明细。4.8 用户角色的创建及授权
23、4.8.1 功能说明通过不同的权限控制系统的不同功能:工资管理员:工资的批量导入、全部员工的工资明细管理、部门信息维护。普通用户:按照条件查询工资明细。超级管理员:工资的批量导入、全部员工的工资明细管理、部门信息维护、权限菜单配置、日志管理(登陆日志、操作日志)。4.8.2 实现方法点击创建角色,输入角色的基本信息,保存信息;通过【授权/除权】按钮对角色进行一级、二级权限的管理。4.9 权限菜单的配置4.9.1 功能说明将所有的操作功能通过配置的方式统一管理,并根据配置编码进行两级功能控制,实现了动态管理角色,动态配置菜单的效果。4.9.2 实现方法将已经开发完成的功能,按照规范编码进行配置,
24、在用户登陆的时候,后台会根据用户获取角色,根据角色获取该角色有操作权限的菜单功能,并在系统中显示;无操作权限的菜单功能不在系统中显示。4.10 日志管理4.10.1 系统会在后台记录登陆时间以及登陆的IP地址,形成统一的登陆日志记录,超级管理员可根据登陆时间,进行具体的用户痕迹查看。4.10.2 系统会在后台记录每一个用户的操作日志,将每一次的操作时间、操作的功能记录,形成系统操作日志记录,超级管理员可根据操作时间,进行具体的用户操作记录查看。4.11 过滤器和监听器4.11.1 是否登陆过滤器当用户发送请求时,检查用户是否登陆,或者超过20分钟没有动作,则判断为session过期,自动进入重
25、新登陆界面。4.11.2 编码过滤器使用gb2312编码,解决中文乱码问题。4.11.3 用户监听器监听当前用户,产生日志记录。登陆日志内容包括:用户登陆时间、登陆IP地址等信息;操作日志内容包括:操作模块、操作人、操作时间、操作模块的具体描述、详细备注。详细设计毕业设计小结第五章 毕业设计小结5.1目标完成情况和不足本软件通过努力,基本上完成了需求中的功能。实现了工资和人事管理的初级应用。由于时间限制,部分功能未纳入系统。如报工资表的导入功能。数据库设计方面由于较多地考虑到了各个库的相对独立性,在结构设计、完整性约束不是很规范。另外变量名、字段名等命名也不规范。无错误处理模块以及帮助系统。由
26、于本人在美学方面的欠缺,程序的界面不是非常美观。程序中遇到的问题和解决办法1)由于用户登陆密码直接存放在数据库中,这样会暴露出用户密码,对系统的安全性造成很大的影响。解决办法:使用MD5加密工具对登陆密码进行加密处理。2)由于系统对数据库操作比较频繁,而连接数据库不仅要开销一定的通讯和内存资源,还必须完成用户验证、安全上下文配置这类任务,因而往往成为最为耗时的操作。解决办法:使用tomcat的自带连接池。多个请求共享一个连接,减少了连接数据库的开销。3)代码优化方面,jsp代码中大量的使用scriptlet,使代码晦涩难懂,增加了代码的维护困难。解决办法:使用jstl标准的标签。4)jsp页面
27、的中文乱码问题。解决办法:由于每个页面都存在这个问题。最后采用了一个监听器。在监听器里把编码设为gb2312。5.2 项目展望这个项目虽然大致完成了预定要求,但是由于时间比较仓促,一些功能具体实现上可能还不能完全满足客户要求。例如用户对自己的工资明细确认功能,多用户的集成测试等。在下一版本的开发中,在这几个方便改进和提高。致谢致谢当我敲完论文的最后一个字符,夜已经很深了,推开房门,站在阳台上,只见一轮明月高悬在夜空中,那银色的光洒满大地,世界显得如此宁静。夜风吹过,让我的头脑顿时清醒,在这几个月的毕业设计过程中,我获得的每一个进步和收获,都凝结着恩师的辛勤培养和许多人的关心帮助 。在这里,我首
28、先要衷心感谢恩师整个论文工作都是在他的精心指导下完成的,望着这厚厚的论文,它的每一页、每一个符号都浸透着导师的心血和汗水。谨以此文表达我对恩师最诚挚的感谢!参考文献参考文献1 javadoc1.4.22 作者:Cay S.Horstmann,Gary Cornell Core Java 2,6e,Volume I:Fundamentals 机械工业出版社 2003年10月1号3 作者: James W.Cooper Java Design Patterns 中国电力出版社 2003年10月1日4 作者:飞思科技产品研发中心 J2EE应用开发(WebLogic +Jbuilder)电子工业出版社
29、 2003年7月1号5 作者:David FlanaganJavascript 权威指南 机械工业出版社 2003年1月1号6 作者:Bruce EckelJava编程思想,机械工业出版社,2002年9月第一版附录附录一 数据库表的结构1 部门信息表( SYS_DEPT)字段描述字段名称字长类型备注部门主键DEPT_ID32VARCHAR2部门名称DEPT_NAME100VARCHAR2部门说明DEPT_COMMENT512VARCHAR2部门领导DEPT_MANAGER32VARCHAR2创建人CREATE_USER32VARCHAR2创建时间CREATE_TIME19VARCHAR22 用
30、户信息表( SYS_USER )字段描述字段名称字长类型备注用户主键USER_ID32VARCHAR2用户登录名LOGIN_NAME32VARCHAR2用户密码LOGIN_PASS32VARCHAR2用户名称USER_NAME100VARCHAR2用户部门DEPT32VARCHAR2性别SEX1VARCHAR2年龄AGE6VARCHAR2身份证号码SFZH18VARCHAR2创建人CREATE_USER32VARCHAR2创建时间CREATE_TIME19VARCHAR23 角色信息表( SYS_ROLE )字段描述字段名称字长类型备注角色主键ROLE_ID32VARCHAR2角色名称ROLE
31、_NAME126VARCHAR2角色说明ROLE_COMMENT512VARCHAR24 用户角色表( SYS_USER_ROLE)字段描述字段名称字长类型备注主键USER_ROLE_ID32VARCHAR2角色主键ROLE_ID32VARCHAR2用户主键USER_ID32VARCHAR25 菜单配置信息表( SYS_RES )字段描述字段名称字长类型备注参数IDRES_ID2CHAR(32)参数名称RES_NAME64VARCHAR2(64)参数编号RES_NUM32VARCHAR2(32)父级资源PARENT_RES32VARCHAR2(32)-1为顶级资源资源类型RES_TYPE1CH
32、AR(1)0- 菜单;1- 操作操作类型OPTION_TYPE1CHAR(1)排序编号SORTINTEGER状态STATE1CHAR(1)0-无效;1-有效6 角色权限表( SYS_ROLE_RES )字段描述字段名称字长类型备注主键ROLE_RES_ID32VARCHAR2角色主键ROLE_ID32VARCHAR2参数主键RES_ID32VARCHAR27 工资表 ( USER_WAGES )字段描述字段名称字长类型备注主键WAGES_ID32VARCHAR2身份证号码USER_SFZH18VARCHAR2基本工资BASE_WAGESINTEGER奖金INTEGER应减工资LOSE_WAGE
33、SINTEGER实际工资WAGESINTEGER工资日期WAGES _DATE19VARCHAR28 登陆日志表( LOGIN_LOG)字段描述字段名称字长类型备注登陆日志IDLOGIN_LOG_ID32VARCHAR2用户IDUSER_ID32VARCHAR2登陆时间LOGIN_TIME19VARCHAR2登陆IPLOGIN_IP32VARCHAR2记录时间LOG_TIME19VARCHAR2状态STATE1VARCHAR29 操作日志表(OPTION_LOG)字段描述字段名称字长类型备注操作日志IDOPTION_LOG_ID32VARCHAR2操作名称OPTION_NAME126VARCH
34、AR2操作时间OPTION _TIME19VARCHAR2操作人OPTION _USER32VARCHAR2备注OPTION_COMMENT512VARCHAR2状态STATE1VARCHAR2附录二 源代码1.监听器(日志生成)package com.dragonsoft.pub;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.http.HttpSession
35、AttributeListener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import javax.servlet.http.HttpSessionActivationListener;import javax.servlet.http.HttpSessionBindingListener;import java.io.PrintWriter;import
36、java.io.FileOutputStream;public final class MySessionListener implements HttpSessionActivationListener ,HttpSessionBindingListener , HttpSessionAttributeListener, HttpSessionListener,ServletContextListener ServletContext context; int users=0; /HttpSessionActivationListener public void sessionDidActi
37、vate(HttpSessionEvent se) logout(sessionDidActivate(+se.getSession().getId()+); public void sessionWillPassivate(HttpSessionEvent se) logout(sessionWillPassivate(+se.getSession().getId()+); /HttpSessionActivationListener /HttpSessionBindingListener public void valueBound(HttpSessionBindingEvent even
38、t) logout(valueBound(+event.getSession().getId()+event.getValue()+); public void valueUnbound(HttpSessionBindingEvent event) logout(valueUnbound(+event.getSession().getId()+event.getValue()+); /HttpSessionAttributeListener public void attributeAdded(HttpSessionBindingEvent event) logout(attributeAdd
39、ed( + event.getSession().getId() + , + event.getName() + , + event.getValue() + ); public void attributeRemoved(HttpSessionBindingEvent event) logout(attributeRemoved( + event.getSession().getId() + , + event.getName() + , + event.getValue() + ); public void attributeReplaced(HttpSessionBindingEvent
40、 se) logout(attributeReplaced(+se.getSession().getId()+,+se.getName()+,+se.getValue()+); /HttpSessionAttributeListener /HttpSessionListener public void sessionCreated(HttpSessionEvent event) users+; logout(sessionCreated( + event.getSession().getId() + ),目前有+users+个用户); context.setAttribute(users,ne
41、w Integer(users); public void sessionDestroyed(HttpSessionEvent event) users-; logout(sessionDestroyed( + event.getSession().getId() + ),目前有+users+个用户); context.setAttribute(users,new Integer(users); /HttpSessionListener /ServletContextListener public void contextDestroyed(ServletContextEvent sce) logout(contextDestroyed()-ServletContext被销毁); this.context = null; public void contextInitialized(ServletContextEvent sce) this.context