版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
V1绪论1.1课题背景随着技术时代的到来,计算机科学技术得到了高速发展,企业开始越来越多地利用计算机解决实际问题。企业员工考勤信息管理是企业信息管理的重要部分。面对大量的企业考勤信息,采用人力处理将浪费大量的时间,人力和物力资源,以及降低了数据准确性。因此,开发一个界面友好,易于操作的企业员工考勤信息管理软件进行自动化处理具有较大的现实意义。同时,企业考勤管理系统是具有代表性的应用系统,它具有一些应用系统的特征,系统结构与现实生活紧密结合,具体直观,开发应用简单,不失一般性。1.2选题意义企业员工考勤管理系统是一个企业不可缺少的一部分,它的存在使得企业的管理人员对员工的考勤变得简单方便。企业考勤管理系统可以为企业提供详细的员工考勤的信息和快捷的管理查询手段。企业考勤管理系统和传统的人工方式管理员工的上下班等信息相比,后者的这种管理方式存在着许多缺点,诸如效率低,操作繁琐,保密性差等,而且随着时间的推移,会产生大量的文件和数据,这给信息的搜索、更新和维护都带来了不少困难。因此,开发一个企业考勤管理系统是很有必要的,具有其特有的技术意义和管理意义。1.3主要内容本课题来自于企业考勤管理的需求,本系统主要实现系统管理、部门管理、公告管理、员工管理、个人考勤、考勤管理等功能,充分利用计算机网络技术,改变传统的操作方式进行管理,实现了网络化管理模式,提高企业对员工考勤的效率。本系统的开发要求采用MVC设计模式和B/S结构体系结构,首先对系统做需求分析,确定系统的使用人员,确定系统中数据流程,确定系统的功能模块组成。然后根据需求分析设计出正确合理的数据库逻辑结构,设计出E-R图,再将它转换成关系模型,对该模型进行优化后在Mysql上实现。最后编写程序,逐个实现每个模块。2系统开发的相关技术和工具2.1JAVA语言Java是面向对象程序设计语言(以下简称Java语言)和Java平台的总称。首先,作为一种程序设计语言,它简单、面向对象、不依赖于机器的结构、具有可移植性、鲁棒性、安全性、并且提供了并发的机制、具有很高的性能。其次,它最大限度地利用了网络,Java的小应用程序(applet)可在网络上传输而不受CPU和环境的限制。另外,Java还提供了丰富的类库,使程序设计者可以很方便地建立自己的系统。Java主要分三块,j2se:java的基础核心语言。j2me:java的微型模块,专门针对内存小,没有持续电源等小型设备。j2ee:java的企业模块,专门针对企业数据库服务器的连接维护。本系统主要使用j2ee,即Java企业级开发。2.2MySQL数据库开发基于B/S结构的上海文思科技公司员工考勤管理系统,需要存储和处理大量的数据,因此就需要选择一个合适的数据库来存储和管理这些数据信息。MySQL是一个快速、多线程、多用户的SQL数据库服务器,其出现虽然只有短短的数年时间,但凭借着“开放源代码”的东风,它从众多的数据库中脱颖而出。除了因为几乎是免费的这点之外,支持正规的SQL查询语言和采用多种数据类型,能对数据进行各种详细的查询等都是MySQL的优点。上海文思科技公司员工考勤管理系统最终选择了小而精的开源MySQL数据库。MySQL安装简单,使用方便,性能足够支持本系统的正常运行。2.3Tomcat服务器Tomcat服务器是一个免费的开放源代码的Web应用服务器。Tomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP规范总是能在Tomcat中得到体现。因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。Tomcat很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好。2.4MyEclipseMyEclipse企业级工作平台(MyEclipseEnterpriseWorkbench,简称MyEclipse)是对EclipseIDE的扩展,在Eclipse的基础上添加了许多实用性的插件,让J2EE开发变得更方便,极大的提高了软件开发的效率。应为它集成了很多J2EEd的开发环境,包括了完备的编码、调试、测试和发布功能。支持HTML,JSP,Struts,CSS,JavaScript等多项功能。本系统选用了MyEclipse作为开发工具。3系统需求分析3.1系统功能分析企业考勤管理系统是一个企事业单位不可缺少的一部分,它的内容对于企业的决策者和管理者来说都是至关重要的,因此,企业考勤管理系统应该能够为用户提供充足人事管理的信息和快捷的管理查询手段。本系统主要企业员工的工作考勤和对员工考勤的管理。本系统主要实现系统管理、部门管理、公告管理、员工管理、个人考勤、考勤管理等功能,充分利用计算机网络技术,改变传统的操作方式进行管理,实现了网络化管理模式,提高企业对员工考勤的效率。1.用户登录:登录系统的身份定为二种,一是管理员(企业领导),二是般普通员工,只有被授权的用户才可以使用本系统的资源。2.系统管理:主要实现员工修改密码、重新登录和安全退出功能。3.员工管理:领导对员工信息的管理,包括新增员工信息的录入、员工信息的查询、修改和删除的操作。4.部门管理:领导对本企业部门的设定,包括添加、查询等功能。5.公告管理:领导对本系统中的所用子级用户进行发布公告及编辑,员工可以查看到公告的信息内容。6.个人考勤:用户登录系统后,可以考勤即上、下班登记。7.请假管理:领导可以以员工的请假信息进行审批(准请假和不准请假)和员工到班的销假、续假的管理。8.考勤管理:领导可以对员工的全部考勤信息进行汇总,生成考勤报表。3.2系统结构分析采用MVC设计模式,选择MySQL作为后台数据库,选择JAVA、JSP、JavaScript、Html作为应用程序开发工具,运用Tomcat服务器技术,整个系统完全基于Browser/Server模式进行设计。MVC设计模式是一个存在于服务器表达层的模型,它将后台操作分开,减少彼此之间的影响,其中MVC是Model-View-Control的简称,即模型-视图-控制器。在MVC模式中,系统使用者通过WEB浏览器向服务器提交的所有请求都会被控制层接收到并进行处理。接受到请求之后,控制器会根据信息判断调用哪一个模型来进行处理从视图层得到的信息。然后模型层根据从用户那里得到的请求信息进行相应的业务逻辑处理,并向控制层返回处理后数据信息;最后控制层将从模型层得到的返回信息转发给视图层,并通过WEB浏览器呈现给用户。示意图见图3-1。图3-1MVC设计模式图系统的建设关键在于其所使用的架构,而本系统是基于WEB的系统,传统的C/S(全称:Client/Server)架构已经不能满足大量用户的访问和操作,B/S(全称:Browser/Server)基于浏览器的架构则是目前网络系统应用的主流,它将大量的数据处理工作交给服务器端来处理,客户端只用通过普通的IE浏览器即可访问系统,方便快捷而且利于系统的更新和维护。这种三层体系结构如图3-2所示:图3-2B/C示意图3.3数据流图本系统的数据流图如图3-3所示。考勤信息考勤信息考勤记录合法员工信息合法员工登录信息员工信息企业管理录入普通员工验证考勤考勤管理查询信息显示图3-3系统数据流图4系统总体设计4.1系统流程图现行系统流程图是分析和描述现行系统业务的重要工具之一。其主要作用是:描述现行系统的业务情况以便与管理人员交流,它是系统设计的前提和保证。本系统流程描述:首先用户登录,登录信息有效后系统根据登录信息判断登录的身份,分为管理层和普通员工两种身份,然后分别进入不同的资源模块。具体如图4-1所示。普通员工普通员工登录信息无效退出用户信息信息判断查询系统资源模块考勤信息考勤管理查询信息个人考勤身份判断管理员(企业领导)图4-1系统流程图4.2系统功能模块本系统总体上分成两大功能模块:管理层功能模块和普通员工功能模块。两大功能模块下具有不同的子模块。管理层的功能模块下包括:系统管理模块、部门管理模块、员工管理模块、请假管理模块、个人考勤模块和考勤汇总管理模块。具体模块层次图见图4-1。员工功能模块下包括:系统控制模块、信息管理模块、个人考勤模块和请假管理模块。具体模块层次图见图4-2。管理层模块管理层模块系统管理部门管理员工管理请假管理个人考勤考勤管理权限管理安全退出部门管理入职管理离职管理个人管理请假管理销假管理个人考勤记录查询考勤汇总记录查询图4-2系统管理层功能模块图考勤登记考勤登记记录查看系统管理个人考勤信息管理请假管理员工模块密码修改退出系统重新登录查看公告通讯录个人信息填写假条假条查看图4-3系统普通用户功能模块图4.3系统数据库设计数据库技术是在文件系统的基础上发展起来的一种高效的数据管理技术,它能保持系统数据的完整性,整体性和共享性。数据库是有组织的,存储在一定结构内的相关数据的集合。在数据库系统中,提供了对数据的访问机制,能有组织地存储相关的数据,具有合理的存储方式,快速的查询效率和最小的数据冗余等特性。另外数据的存储和应用程序彼此独立,不仅便于数据的管理与控制而且有利于应用程序的编写与调试。数据库类似于一个数据的大仓库,能很好地实现数据共享,本身就具有数据的增,删,改、查等功能,能维护数据的一致性。数据库设计是系统设计的一个重要内容,其设计质量的好坏直接影响系统开发的成败,系统的质量,系统效率及可维护性。4.3.1数据库概念结构设计概念模型设计是本系统整个数据库设计的关键,是各种数据模型的共同基础。(1)员工实体中包括了员工编号、姓名、性别、电话、地址、出生日期、部门编号、权限。其E-R图见图4-4。员工员工出生日期权限所属部门地址电话性别姓名编号图4-4员工实体的E-R图(2)公告实体中包括了标题、内容、作者、所属部门、发布时间。其E-R图见图4-5。公告公告标题内容作者所属部门发布时间图4-5公告实体E-R图(3)部门实体中包括了部门编号、部门名称。其E-R图见图4-6。图4-6部门实体E-R图(4)个人考勤实体中包括了员工编号、日期、上班时间、下班时间、工作时间、迟到时间、早退时间、性质。其E-R图见图4-7。迟到时间迟到时间性质早退时间工作时间下班时间上班时间日期员工编号个人考勤图4-7个人考勤实体的E-R图(5)假条实体中包括了员工编号、假条种类、请假理由、开始时间、结束时间、请假天数、审批状态、销假状态。其E-R图见图4-8。请假天数请假天数销假状态审批状态结束时间开始时间请假理由假条种类员工编号假条图4-8请假实体的E-R图(6)考勤汇总实体中包括了员工编号、考勤时间、应到天数、请假天数、实到天数、迟到次数、早退次数、出勤率、考勤率。其E-R图见图4-9。图4-9考勤汇总实体的E-R图(7)各实体之间关系的E-R图。见图4-10。111m员工考勤记录部门假条公告属于填写登记查看1n1mn图4-10各实体之间的E-R图4.3.2数据库物理结构设计用Mysql建立eeams数据库,并建立数据表。总共创建了七张表,分别为:员工登录信息表(loginInfo)、员工详细信息表(employee)、公告表(notice)、部门表(departmen)、考勤表(attendance)、请假信息表(leave)、考勤汇总表(total)。下面为数据库涉及到的部分相关数据表。表4-1员工登录信息表(loginInfo)名称字段名称数据类型主键非空备注登录帐号loginIdvarchar(6)yesyes登录密码pwdVarchar(6)noyes登录状态stateint(1)noyes0:管理人员1:普通员工
表4-2员工详细信息表(employee)名称字段名称数据类型主键非空备注员工帐号loginIdVarchar(6)yesyes员工姓名namevarchar(10)noyes员工性别sexvarchar(4)noyes联系电话phonelong(11)noyes户口所在地addressVarchar(50)noyes出生日期birthdaydatenoyes所属部门dep_novarchar(20)noyes外键权限stateint(1)noyes0:管理人员1:普通员工表4-3公告表(notice)名称字段名称数据类型主键非空备注记录IDidintyesyes标题titlevarchar(40)noyes公告内容contentvarchar(200)noyes作者loginIdvarchar(10)noyes外键所属部门dep_novarchar(20)noyes外键添加时间add_timedatetimenoyes表4-4部门表(departmen)名称字段名称数据类型主键非空备注部门编号dep_noVarchar(6)yesyes部门名称depnamevarchar(20)noyes表4-5考勤表(attendance)名称字段名称数据类型主键非空备注记录IDidInt(4)yesyes用户IDloginIdvarchar(6)noyes外键日期datedatenoyesyyyy/mm/dd上班时间start_workdatetimenoyes24hh:mm:ss下班时间over_workdatetimenono24hh:mm:ss工作时间work_timedouble(4,2)nono单位小时迟到时间late_timedouble(4,2)nono单位小时早退时间early_timedouble(4,2)nono单位小时表4-6请假信息表(leave)名称字段名称数据类型主键非空备注假条IDidInt(4)yesyes员工编号loginIdVarchar(6)noyes外键假条的种类typeVarchar(20)noyes请假理由reasonVarchar(200)noyes请假开始时间Start_timedatenoyesyyyy/mm/dd请假结束时间Over_timedatenoyesyyyy/mm/dd请假天数Leave_daysDouble(4,2)noyes单位:天审批状态stateInt(1)nono0:未审批1:准许-1:不准许销假xstateintnono0未销假1已销假
表4-7考勤汇总表(total)名称字段名称数据类型主键非空备注用户IDloginIdVarchar(6)yesno外键考勤时间dateVarchar(8)yesnoyyyy-mm应到天数word_dayDouble(4,2)nono单位:天请假天数leave_daydouble(4,2)nono单位:天实到天数real_daydouble(4,2)nono单位:天迟到次数lateint(2)nono早退次数earlyInt(2)nono出勤率ratedouble(4,2)nono考勤率rate_adouble(4,2)nono5系统详细设计和实现5.1指导思想系统功能设计本着从用户角度出发的原则,要求实用,且符合用户提出的合理需求。系统设计在不违反系统整体性的基础上,可根据用户的需求进行二次开发,不断完善系统功能,便于系统的不断升级。5.2功能模块设计与实现企业考勤管理系统分为登录管理、系统管理、员工管理、部门管理、公告管理、请假管理、个人考勤、考勤管理等模块。各模块的具体功能划分如下:5.2.1登录模块进入考勤管理系统首先需要登录,本系统分为两种登录身份,分别为:管理层和普通员工。不同的身份登录成功进入不同的主页面。登录页面见图5-1。图5-1系统登录页面管理层登录成功主页面见图5-2。图5-2管理层主页普通员工登录成功主页面见图5-3。图5-3普通员工主页关键代码:if(loginInfo!=null){ ActionContextcontext=ActionContext.getContext(); Mapsession=(Map)context.get("session"); session.put("loginId",loginInfo.getLoginId()); session.put("pwd",loginInfo.getPwd()); if(loginInfo.getState()==1){ return"common";//普通员工登录 }else{ return"admin";//管理层(领导)登录 } }else{ this.addFieldError("loginError","用户名或密码错误!"); returnINPUT;//登录失败 }5.5.2系统管理模块系统管理模块包括修改密码、重新登录和安全退出功能。修改密码:本系统用户登录的初始密码为888888,系统使用者可以修改登录密码。修改之前系统将会验证原始密码是否正确。见图5-4。图5-4修改密码页面重新登录:点击重新登录,系统将调到登录界面,见图5-5。图5-5重新登录安全退出:系统将自动关闭,即关闭当前浏览器页面,见图5-6。图5-6安全退出5.5.3员工管理模块员工管理模块包括入职管理、离职管理和个人信息管理三大子模块。具体包括录入员工信息、查询员工信息、修改员工信息、删除员工信息、个人信息查看等功能。查询员工信息:点击之后页面将分页显示所有员工信息,还可以多条件具体查询,按员工编号、姓名、部门等条件查询。有点条件可以模糊查询如按姓名查询,见图5-7。图5-7员工信息查询页面关键代码:Stringwhere="where1=1"; if(employee==null){ }else{ if(!employee.getLoginId().isEmpty()){ where+="andloginId="+"'"+employee.getLoginId()+"'"; } if(!employee.getName().isEmpty()){ where+="andnamelike"+"'%"+employee.getName()+"%'"; } if(!employee.getDepartment().isEmpty()){ where+="anddepartment="+"'"+employee.getDepartment()+"'"; } if(!(employee.getState()==-1)){ where+="andstate="+employee.getState(); } } Stringsql="select*fromemployee"+where;5.5.4部门管理模块部门管理模块是管理层对本企业部门设置的管理包括新增、查询、修改和删除部门等功能,见图5-8。图5-8部门管理页面5.5.5公告管理模块公告管理模块是领导对本系统中的所用子级用户进行发布公告。管理层可以发布和删除公告。普通员工只可以查看公告,见图5-9,5-10。图5-9发布公告页面图5-10查看公告页面关键代码:前台页面attendRecord.jsp:<trbgcolor="#4D4D4D"> <tdclass="out">序号</td> <tdclass="out">标题</td> <%--<td>内容</td>--%> <tdclass="out">作者</td> <tdclass="out">所属部门</td> <tdclass="out">作成日时</td> <tdclass="out">操作</td></tr><s:iteratorvalue="noticeList"var="notice"status="st"><tr><tdclass="in"><s:propertyvalue="#notice.id"/></td> <tdclass="in"><ahref="javascript:toUpdate('notice!SearchNoticeById?notice.id=<s:propertyvalue="#notice.id"/>')"> <s:propertyvalue="#notice.title"/> </a> </td> <%--<td><s:propertyvalue="#notice.content"/></td>--%> <tdclass="in"><s:propertyvalue="#notice.writer"/></td> <tdclass="in"><s:propertyvalue="#notice.depname"/></td> <tdclass="in"> <s:datename="#notice.add_time"format="yyyy-MM-dd"/></td> <tdclass="in"><ahref="javascript:toDel('notice!DeleteNotice?notice.id=<s:propertyvalue="#notice.id"/>')">删除</a></td></tr></s:iterator>后台AttendAction.java://判断是否已经登记过 if(attendanceService.SearchByExample(attendance.getLoginId(),attendance.getDate())){ this.addFieldError("error","您已经登记过!"); attendance=attendanceService.Search(attendance.GetLoginId(),attendance.getDate()); returnINPUT; } //判断是否迟到(迟到的时间) if(!attendance.getStart_work().isEmpty()){ Stringh=(attendance.getStart_work()).substring(0,2); Stringm=(attendance.getStart_work()).substring(3,5); if(Integer.parseInt(h)<9){//九点之前签到 attendance.setLate_time(0.0); }elseif(Integer.parseInt(m)<=5&&Integer.parseInt(h)<10){//九点零五分之前到 attendance.setLate_time(0.0); }else{//迟到 //四舍五入保留两位小数 attendance.setLate_time((Double.parseDouble(h)-9)+Math.round(Double.parseDouble(m)/60*100)/100.0); } } //登记 if(attendanceService.AddStartRecord(attendance)){ attendance=attendanceService.Search(attendance.getLoginId(),attendance.getDate()); returnSUCCESS; }5.5.6请假管理模块请假管理模块是对企业员工请假申请和销假的管理。员工请假首先需要填写假条,然后提交等待领导的审批。员工查看假条状态,审批通过方可休假。员工回到公司需要销假,确认具体请假的天数和日期,分别见图5-11,5-12,5-13,5-14。图5-11填写假条页面图5-12查看假条状态页面图5-13领导审批假条页面图5-14销假确认页面5.5.7个人考勤模块个人考勤模块主要实现员工每天的上班登记、下班登记和记录查看。员工到班需要点击上班登记,下班之前需要点击下班登记。上班登记:记录员工的上班时间、是否迟到等信息,见图5-15。图5-15上班登记页面下班登记:记录员工的下班时间,是否早退和计算出当天的工作时间,见图5-16。图5-16下班登记页面关键代码:<tr><tdalign="center"><imgalt="上班登记"height="50"width="50"src="<%=basePath%>/images/on.jpg"onclick="doAction('attendance!AddStartRecord?attendance.loginId=${loginId}&attendance.start_work=<%=time%>&attendance.date=<%=date%>');"><br>上班登记</td><tdalign="center"><imgalt="下班登记"height="50"width="50" src="<%=basePath%>/images/off.jpg" onclick="doAction1('attendance!AddOverRecord?attendance.loginId=${loginId}&attendance.over_work=<%=time%>&attendance.date=<%=date%>&attendance.start_work=${attendance.start_work}');"> <br>下班登记</td></tr>记录查看:查看员工个人考勤的历史记录,见图5-17。图5-17历史记录查看页面5.5.8考勤管理模块考勤管理模块是企业领导对企业员工个人考勤的汇总管理。主要实现当月考勤报表的生成和对员工和部门的考勤汇总,分别见图5-18,5-19,5-20。图5-18考勤报表生成页面图5-19员工考勤汇总页面图5-20部门考勤汇总页面6系统测试6.1系统测试的目的和意义系统测试的目的是发现编程过程中存在的问题和系统使用不合理的操作。成功的测试可以找到很容易忽略的或者极难发现的错误。进行系统测试就是希望在系统正式使用前尽可能多的发现系统存在的问题,并寻找解决的方案,不断的修改,最终得到比较完善的系统。6.2测试在完成本系统之后,我对本系统进行了一些简单的测试。测试的主要内容包括数据录入验证(是否为制定的类型)、查询测试、数据重复验证等。6.2.1数据录入验证数据录入验证测试确保数据库插入数据的合法性,非法的数据录会让系统发生异常,影响系统正常运行。因此数据验证是非常必要的。非空验证测试:输入:员工编号=A0010,员工姓名:空输出:见图6-1。图6-1非空验证测试数值型数据录入测试:输入:本月天数=a(天数应为整数类型)输出:见图6-2图6-2数值类型验证测试6.2.2查询测试本系统的查询支持多条件查询,特定的查询条件可以模糊查询。以员工信息查询为例测试如下:多条件查询:输入:员工编号=空;员工姓名=空;所属部门=研发部;员工权限=普通员输出:见图6-3图6-3多条件查询测试模糊查询输入:员工编号=空;员工姓名=三;所属部门=不限;员工权限=不限输出:见图6-4图6-4模糊查询测试6.2.3重复数据测试有的数据是唯一的,不能重复出现的,比如员工编号。在录入新增员工信息时,员工的编号是不能重复的。输入:员工编号=A0001输出:见图6-5图6-5重复数据测试结论通过本系统为期四个月的设计,我付出了许多,当然也从这个过程中学到了很多,不论是分析问题的能力还是技术方面都得到了提升。当然在系统设计的过程中,我也遇到了很多的困难。我也感到很郁闷,不过既然决定认真去完成这个系统,我只有静下心来分析问题出在哪里,然后寻找解决的方法。通过上网查找资料和请教他人但,我最终还是把问题一个一个的解决了。现在回头看看,我心里还是很开心,应为从这个过程中,我获得了成就感。在技术方面,我通过这个设计无论是对Java语言、Mysql或是SQL语言我都有了质的提高。但是在技术的过程中,我也是遇到了一些实战的问题,而这些问题就成了我的绊脚石,我通过查看参考书和网上的解决办法也解决了一部分,比如说,分页的问题,通过查阅资料,和不断的尝试最终还被我是解决了。现在我终于把这个系统做好了。其实也是有一种很好的成就感,不管最终结果怎样,至少我已经收获了过程。参考文献[1]孙卫琴.Tomcat与JavaWeb开发技术详解[M].电子工业出版社,2009.[2]祝定泽,张海,黄建昌.MySQL核心内幕[M].北京:清华大学出版社,2010.[3]王毅.JSP程序开发范例宝典[M].人民邮电出版社,2007.[4]程志艳,张亮,马建红.JSP实用简明教程[M].清华大学出版社,2005.[5]陈丹丹.JavaWeb典型模块与项目实战大全[M].电子工业出版社,2012.[6]李斌,孙岩,王康寿,郑尚魁.教学网站设计.学科建设[J].远程教育,2005.[7]于海霞,王家骐.基于Struts的WEB框架设计与应用[J].电脑知识与技术,2010.[8]耿伟,刘振海,孙磊.Struts2框架技术的研究与分析[J].电脑知识与技术,2008.[9]孙良军.HTML+CSS+JavaScript网页设计与布局实用教程[M].北京:清华大学出版社,2011.[10]劳凤丹.基于WEB的高校公房管理系统的设计与实现[M].清华大学出版社,2012.[11]王征.JavaScript网页特效实例大全[M].北京:清华大学出版社,2006.[12]陈雄华.精通MyEclipse[M].北京:电子工业出版社,2009.[13]陆凌牛.HTML+CSS网页设计指南[M].机械工业出版社,2011.[14]闫建强.Web服务开发学习实录[M].清华大学出版社,2011.[15]张芳芳.CSSWeb开发学习实录[M].清华大学出版社,2011.附录附录1工程的配置文件web.xml:<?xmlversion="1.0"encoding="UTF-8"?><web-appversion="2.5"xmlns="/xml/ns/javaee" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list><!--注册中文乱码过滤器--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>cn.hdj.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--struts2核心过滤器--> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping></web-app>Struts的配置文件struts.xml:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.1//EN""/dtds/struts-2.1.dtd"><struts> <constantname="struts.il8n.encoding"value="UTF-8"></constant> <packagename="user"extends="struts-default"namespace="/"> <actionname="login"class="cn.hdj.action.LoginAction"> <resultname="admin">/index.jsp</result> <resultname="common">/index_1.jsp</result> <resultname="input">/login.jsp</result> <resultname="update_success">/message/successed.jsp</result> <resultname="update_failed">/users/updatePassword.jsp</result> </action> <actionname="employee"class="cn.hdj.action.EmployeeAction"> <resultname="success">/message/successed.jsp</result> <resultname="error">/message/error.jsp</result> <resultname="input">/users/addEmployee.jsp</result> <resultname="idcheck">/users/addEmployee.jsp</result> <resultname="show">/users/searchEmployee.jsp</result> <resultname="update">/users/updateEmployee.jsp</result> <resultname="oneself">/users/showOneselfInfo.jsp</result> <resultname="telBook">/users/telBook.jsp</result> </action> <actionname="dep"class="cn.hdj.action.DepAction"> <resultname="success">/message/ok.jsp</result> <resultname="error">/message/error.jsp</result> <resultname="input">/admin/addDep.jsp</result> <resultname="show">/admin/searchDep.jsp</result> <resultname="toShow">/users/showDep.jsp</result> <resultname="showDep">/users/addEmployee.jsp</result> <resultname="update">/admin/updateDep.jsp</result> </action> <actionname="notice"class="cn.hdj.action.NoticeAction"> <resultname="success">/message/successed.jsp</result> <resultname="error">/message/error.jsp</result> <resultname="input">/notice/addNotice.jsp</result> <resultname="show">/notice/searchNotice.jsp</result> <resultname="showOne">/notice/notice.jsp</result> <resultname="toShow">/notice/showNotice.jsp</result> </action> <actionname="leave"class="cn.hdj.action.LeaveAction"> <resultname="success">/message/ok.jsp</result> <resultname="error">/message/error.jsp</result> <resultname="input">/leave/addLeave.jsp</result> <resultname="show">/leave/searchLeave.jsp</result> <resultname="showAll">/leave/searchAllLeave.jsp</result> <resultname="over">/leave/overLeave.jsp</result> <resultname="approve">/leave/approve.jsp</result> <resultname="update">/leave/overLeavePre.jsp</result> </action> <actionname="attendance"class="cn.hdj.action.AttendanceAction"> <resultname="success">/attend/attendRecord.jsp</result> <resultname="ok">/attend/attendRecord.jsp</result> <resultname="error">/message/error.jsp</result> <resultname="input">/attend/attendRecord.jsp</result> <resultname="history">/attend/historyRecord.jsp</result> <resultname="historyAll">/attend/historyRecord_all.jsp</result> </action> <actionname="total"class="cn.hdj.action.TotalAction"> <resultname="success">/admin/createTotal.jsp</result> <resultname="toShow">/admin/searchTotal.jsp</result> <resultname="depTotal">/admin/searchDepTotal.jsp</result> </action> </package></struts>数据库配置文件c3p0-config.xml:<?xmlversion="1.0"encoding="UTF-8"?><c3p0-config><!--默认配置,在ComboPooledDataSource()构造方法中不写任何东西--> <default-config> <!--配置数据库的连接信息--> <propertyname="jdbcUrl">jdbc:oracle:thin:@3:1521:orcl</property> <propertyname="user">scott</property> <propertyname="password">tiger</property> <propertyname="driverClass">oracle.jdbc.driver.OracleDriver</property> <!--初始化数据库连接池的大小--> <propertyname="initialPoolSize">10</property> <propertyname="maxIdleTime">30</property> <!--配置最大的连接池数量--> <propertyname="maxPoolSize">20</property> <propertyname="minPoolSize">2</property> <propertyname="maxStatements">200</property> <user-overridesuser="test-user"> <propertyname="maxPoolSize">10</property> <propertyname="minPoolSize">1</property> <propertyname="maxStatements">0</property> </user-overrides> </default-config><!--Thisappismassive!--> <!--name为mysql的配置,在ComboPooledDataSource()构造方法中写上"mysql"--> <named-configname="mysql"> <propertyname="jdbcUrl">jdbc:mysql://localhost:3306/eeams?useUnicode=true&characterEncoding=utf-8</property> <propertyname="user">root</property> <propertyname="password">www2335506</property> <propertyname="driverClass">com.mysql.jdbc.Driver</property> <!--初始化数据库连接池的大小--> <propertyname="initialPoolSize">10</property> <propertyname="maxIdleTime">30</property> <!--配置最大的连接池数量--> <propertyname="maxPoolSize">20</property> <propertyname="minPoolSize">2</property> <propertyname="maxStatements">200</property> </named-config></c3p0-config>附录2考勤登记关键代码:Jsp:<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%><%@taglibprefix="s"uri="/struts-tags"%><%Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%java.text.SimpleDateFormatformatter=newjava.text.SimpleDateFormat("yyyy-MM-ddHH:mm:ss");java.util.DatecurrentTime=newjava.util.Date();//得到当前系统时间Stringstr_date=formatter.format(currentTime);//将日期时间格式化Stringstr_date2=currentTime.toString();//将Date型日期时间转换成字符串形式Stringdate=str_date.substring(0,10);Stringtime=str_date.substring(11,19);%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><basehref="<%=basePath%>"><title>MyJSP'attendRecord.jsp'startingpage</title> <metahttp-equiv="pragma"content="no-cache"> <metahttp-equiv="cache-control"content="no-cache"> <metahttp-equiv="expires"content="0"> <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3"> <metahttp-equiv="description"content="Thisismypage"> <linkrel="stylesheet"type="../css/common.css"href="styles.css"> <SCRIPTtype="text/javascript">functiondoAction(url){ document.forms[0].method="post"; document.forms[0].action=url; document.forms[0].submit();}functiondoAction1(url){if(confirm("确定现在下班?")){document.forms[0].method="post"; document.forms[0].action=url; document.forms[0].submit();}} </SCRIPT></head><body><FONTcolor="red"><s:fielderrorfieldName="error"></s:fielderror></FONT><center><formaction="attendance!AddStartRecord"name="form1"method="post"><tablewidth="100%"border="1"bordercolor="#D1EEEE"cellspacing="0"><tr><tdalign="center"><imgalt="上班登记"height="50"width="50"src="<%=basePath%>/images/on.jpg"onclick="doAction('attendance!AddStartRecord?attendance.loginId=${loginId}&attendance.start_work=<%=time%>&attendance.date=<%=date%>');"><br>上班登记</td><tdalign="center"><imgalt="下班登记"height="50"width="50"src="<%=basePath%>/images/off.jpg"onclick="doAction1('attendance!AddOverRecord?attendance.loginId=${loginId}&attendance.over_work=<%=time%>&attendance.date=<%=date%>&attendance.start_work=${attendance.start_work}');"> <br>下班登记</td></tr><trbgcolor="#DEDEDE"><tdcolspan="2"align="center"><b>今天的考情记录</b></td></tr></table><divstyle="border-color:red;border-style:none"id="showTable"><tablewidth="100%"border="1"bordercolor="#D1EEEE"cellspacing="0"><trbgcolor="#DEDEDE"> <td>用户姓名</td> <td>上班时间</td> <td>下班时间</td> <td>工作时长(h)</td> <td>迟到时间(h)</td> <td>早退时间(h)</td> <td>工作性质</td></tr><trheight="100"><td>${}</td> <td>${attendance.start_work}</td> <td>${attendance.over_work}</td> <td>${attendance.work_time}</td> <td>${attendance.late_time}</td> <td>${attendance.early_time}</td> <s:iftest="%{attendance.state==0}"> <td><fontcolor="red">工作时间不足8小时</font></td> </s:if> <s:else> <s:iftest="%{#attendance.state==1}"> <td><fontcolor="green">正常班</font></td> </s:if> <s:elseiftest="%{#attendance.state==2}"> <td><fontcolor="blue">加班</font></td> </s:elseif> </s:else></tr></table></div></form></center></body></html>Action:/***@author胡大景*2013-3-21*@version*/packagecn.hdj.action;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.List;importmon.BeansFactory;importmon.Paging;importcn.hdj.model.Attendance;importcn.hdj.model.Employee;importcn.hdj.service.AttendanceService;importcn.hdj.service.EmployeeService;importcom.opensymphony.xwork2.ActionSupport;/***个人考勤**/publicclassAttendanceActionextendsActionSupport{ /** * */ privatestaticfinallongserialVersionUID=1L; privateAttendanceattendance; privateEmployeeemployee; privateList<Attendance>attendanceList; privateStringyears; privateStringmonths; privateStringdays; privateStringcur_page; privateStringtoolBar; AttendanceServiceattendanceService=(AttendanceService)BeansFactory.getBean("attendanceService"); EmployeeServiceemployeeService=(EmployeeService)BeansFactory.getBean("employeeService"); //上班登记 publicStringAddStartRecord(){ employee=employeeService.searchEmployeeByLoginId(attendance.getLoginId()); //判断是否已经登记过 if(attendanceService.SearchByExample(attendance.getLoginId(),attendance.getDate())){ this.addFieldError("error","您已经登记过!"); attendance=attendanceService.Search(attendance.getLoginId(),attendance.getDate()); returnINPUT; } //判断是否迟到(迟到的时间) if(!attendance.getStart_work().isEmpty()){ Stringh=(attendance.getStart_work()).substring(0,2); Stringm=(attendance.getStart_work()).substring(3,5); if(Integer.parseInt(h)<9){//九点之前签到 attendance.setLate_time(0.0); }elseif(Integer.parseInt(m)<=5&&Integer.parseInt(h)<10){//九点零五分之前到 attendance.setLate_time(0.0); }else{//迟到 //四舍五入保留两位小数 attendance.setLate_time((Double.parseDouble(h)-9)+Math.round(Double.parseDouble(m)/60*100)/100.0); } } //登记 if(attendanceService.AddStartRecord(attendance)){ attendance=attendanceService.Search(attendance.getLoginId(),attendance.getDate()); returnSUCCESS; } returnERROR; } //下班登记 publicStringAddOverRecord(){ employee=employeeService.searchEmployeeByLoginId(attendance.getLoginId()); //判断是否已经登记过 if(!attendanceService.SearchByExample(attendance.getLoginId(),attendance.getDate())){ this.addFieldError("error","您尚未进行上班登记操作!"); returnINPUT; } Stringover=attendance.getOver_work().substring(0,2); AttendanceattendanceTemp=attendanceService.Search(attendance.getLoginId(),attendance.getDate()); Stringstart=attendanceTemp.getStart_work().substring(0,2); if(Integer.parseInt(over)-Integer.parseInt(start)>9){ attendance.setState(2);//加班 }elseif(Integer.parseInt(over)-Integer.parseInt(start)>8){ attendance.setState(1);//正常班 }else{ attendance.setState(0); } attendance.setWork_time(getWork_time(attendanceTemp.getStart_work(),attendance.getOver_work())); //判断是否早退(早退的时间) if(!attendance.getOver_work().isEmpty()){ Stringh=(attendance.getOver_work()).substring(0,2); Stringm=(attendance.getOver_work()).substring(3,5); if(Integer.parseInt(h)>=18){//十八点之后下班 attendance.setEarly_time(0.0); }elseif(Integer.parseInt(m)>=45&&Integer.parseInt(h)>=17){//十七点四十五之后下班 attendance.setEarly_time(0.0); }else{//早退 //四舍五入保留两位小数 attendance.setEarly_time((18-Double.parseDouble(h))-Math.round(Double.parseDouble(m)/60*100)/100.0); } } //登记 if(attendanceService.AddOverRecord(attendance)){ attendance=attendanceService.Search(attendance.getLoginId(),attendance.getDate()); returnSUCCESS; } returnERROR; } //历史记录(all) publicStringHistoryRecordAll(){ Stringdate=years; if(!months.equals("00")){ date+="-"+months; if(days!=""){ if(days.length()==1){ date+="-0"+days; }else{ date+="-"+days; } } } attendanceList=attendanceService.SearchByLoginId(attendance.getLoginId(),date); /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 手术室医院感染管理工作计划
- 2026年交通推广数字孪生合同
- 2026年服装培训猎头招聘合同
- 村居家长学校工作制度
- 村支三委组织工作制度
- 预防接种育苗工作制度
- 领导带头接访工作制度
- 风险降级工作制度汇编
- 高龄津贴工作制度规定
- 吉林市丰满区2025-2026学年第二学期五年级语文期末考试卷(部编版含答案)
- 2026江西抚州市公务用车保障服务中心有限公司招聘员工20人考试参考题库及答案解析
- 2026内蒙古锡林郭勒盟阿巴嘎旗林草执法人员补充招收6人备考题库含答案详解(综合题)
- (贵州一模)贵州省2026年4月高三年级适应性考试物理试卷(含标准答案)
- 安全仪表系统管理制度
- 2026年内蒙古联通校园招聘笔试备考试题及答案解析
- 应急物流风险预警-洞察与解读
- 2026四川绵阳市三台县公安局招聘警务辅助人员60人参考考试题库及答案解析
- 保税仓介绍教学课件
- 旧楼外墙改造安全防护方案
- 字母圈sm协议书
- 2025年哈尔滨市南岗区中小学教师招聘笔试参考试题及答案解析
评论
0/150
提交评论