课程设计报告
题 目 考勤管理系统
---课程设计报告
课 程 名 称 软件项目实践(一)
院部名称 信息技术学院
专 业 计算机科学与技术
班 级 09计算机科学与技术(1)
学 生 姓 名
学 号
课程设计地点 B407
课程设计学时 40
指 导 教 师 XX
1导言
1、1系统开发目的
考勤系统进行企业管理越来越适应企业的需要,集信息的输入,显示,修改,删除等各种处理,信息维护方便,给公司可以带来很大的便利。
1、2背景
考勤管理系统利用计算机管理考勤工作,大大降低了工作人员的工作量,提高工作效率,对于员工们的出勤率有个明显的记录,对于公司的职员也有基本了解根据出勤情况可以计算员工的实际工资。
2、考勤管理系统的需求分析
作为一个考勤系统.最重要的功能当数考勤了.也就是能够将员工上班签到的日期与时间记录下来。当然.记录下签到信息后,应该具有其他的辅助功能.比~II1"查询员工某天的签到情况”、”修改签到情况”、”员工的维护”、”公司上班时间的设置”等.下面就本系统完成的功能做一个简单的需求分析。
2、1签到功能
这是最核心的功能。当员工上班后,输入自己的员工号进行签到操作.就可以把到达公司的时间记录下来.并且保存到数据库中,以备查询。在签到过程中,需要记录的信息包括员工号、签到的日期和签到的具体时间,最好能把签到的结果记录下来.这些结果包括以下几种:正常、迟到、出差、请假、旷班。
2、2查询功能
签到功能中要求将员工上班的签到情况记录下来.也就是供以后查询用。若要查询某个员工在某段时问或者某天的出勤情况,只要输入员工号,并输入要查询的日期.即可将此员工在当天的出勤情况显示出来
2、3修改功能
对于出勤到公司的员工来说.通过签到即可将签到信息记录下来,并且只有两种结果”正常”和”迟到”。可是对于因为某种原因(出差、请假等)不能到公司的员工来说,因为没有签到.就没有当天的出勤记录。为此增加了修改功能,主管人员可以对员工的信息进行修改,将每个员工的出差请假等情况记录下来。
3、应用环境
客户机为普通PC
CPU:P(R) 2.1GHz;
内存:2G
WindowXP等
分辨率适应屏幕。
4、功能规格
1) 考勤管理
2) 基本信息输入
3) 考勤统计
4) 日志查询及统计
5、性能需求
确保可靠性,保证信息的正确完整,有严格的管理权限只有系统规定人员才可以进入查询,防止非法侵入和数据的丢失。
6、参考资料
1. 《软件工程案例教程》,韩万江等,机械工业出版社;
2.《需求分析与系统设计》,Lesxek A.Maciasxek著,机械工业出版社;
3.《软件测试技术概论》,古乐、史九林,清华大学出版社;
4.《软件测试 第2版》,Paul C.Jorgensen,机械工业出版社。
7.基本设计概念
7.1系统整体设计思想
本系统按照.NET体系标准进行设计与开发。采用OOD(面向对象)设计方法,将系统中的所有参与者都视为对象,根据需求调研报告来确定每个对象的属性与方法,和对象之间的关系。整个系统采用细粒度概念来设计对象,拆分功能复杂的对象,使每个对象的功能单一化,以提高系统的可扩展性。
7.2系统安全设计
为了防范黑客及其它非法入侵,以及考勤信息的泄漏,本系统在安全控制上采用杀毒软件和分级用户权限管理并行的方式。
8、需求规定
考勤管理根据用户需求,系统功能结构如下:
8-1结构图
9、各功能分析
9、1增加考勤记录
功能描述:
1.上班时间打卡信息录入
a. 8点之前打卡员工到勤信息的录入
b. 8:00 – 8:30之间员工迟到信息的录入
c.8:30之后员工到达或不到(缺勤)信息的录入(即录入时已认为缺勤,是否到达的信息不由系统控制)
2. 下班时间打卡信息录入
a . 16:00之前员工打卡离开记为缺勤信息的录入
b. 17:30之前员工打卡离开记为早退信息的录入
录入限制条件:
1. 打卡器首先向系统输入员工的编号,由系统自动录入,已有考勤信息的,考勤信息则是只读的,反之则可写的。
2. 当处于固定时间段时,无法录入其他时间段的信息。
当考勤信息已先行录入时,查询考勤系统,已只读显示考勤情况。
9、2考勤信息的删除
功能描述:
当考勤系统处错误的时候,要能够调出并删除这些记录。例如,当员工发现自己的考勤信息有错误时,可以向自己的上级反映,以便及时删除。
9、3系统管理
权限管理
a. 普通员工可以查询自己某一天或某一时间段内的到岗情况;
b. 初级管理员(部门负责人)可以修改并查询该部门的某个员工在某一天或某一时间段的到岗情况,是否存在违规,如有违规,违规类型是什么;
c. 高级管理员(总负责人)拥有初级管理员的能力,并可对初级管理员进行任务的分派,增加和删除。
9. 4考勤信息修改
系统功能:当员工的考勤信息录入不当时,这时应该及时向上级反映,上机根据情况修改该员工的考勤信息。
1.1员工应被授予任何时候查询自己的考勤信息的权限,以便及时发现自己的考勤信息中的错误及遗失。
1.2员工没有修改自己的考勤信息的权限,只有在发现自己的信息出现错误后及时向管理员反映,以便管理员能够及时修改系统错误。
9、5考勤信息检索
10、功能描述:
对公司所有员工的到岗信息进行查询
10-1系统流程图
11、实现功能介绍:
能够按照页面所列项的AND或者OR进行查询,查询结果可以显示出:
a. 普通员工可以查询自己某一天或某一时间段内的到岗情况;
b. 初级管理员(部门负责人)可以修改并查询该部门的某个员工在某一天或某一时间段的到岗情况,是否存在违规,如有违规,违规类型是什么;
c. 高级管理员(总负责人)拥有初级管理员的能力,并可对初级管理员进行任务的分派,增加和删除。
12、查询结果页面表头如下:
1. 员工姓名
2. 员工编号
3. 所属部门
4. 处罚日期
5. 违规次数
6. 违规类型
13、详细设计概述
根据需求分析画出UML建模如下;
13-1 UML模型
系统E-R图
13-2 E-R图
活动图
13-3活动图
14、数据库设计
14、1数据库需求分析
针对本系统,通过对企业考勤管理的内容和数据流程分析,设计的数据项和数据结构如下所示:
1. 员工考勤信息。包括的数据项有员工号、缺勤时间、缺勤天数、缺勤类别。
2. 缺勤类型信息。包括的数据项有缺勤类型、名称、描述等。
14、2数据库逻辑结构设计
在上面的实体以及实体之间关系的基础上,形成数据库中的表格以及各个表格之间的关系。
考勤管理系统数据库中各个表格的设计结果如下面的几个表格所示。每个表格表示在数据库中的一个表。
表1为考勤管理表
表1 考勤管理表格kq
表2为缺勤管理表
表2 缺勤类别表格qqlb
表3为考勤管理表kq
表2 员工基本情况表格yg
14、3数据库结构的实现
经过前面的需求分析和概念结构设计后,得到数据库的逻辑结构,现在就可以在SQL SERVER2000数据库系统中实现该逻辑结构,这是利用SQL SERVER2000数据库系统中的SQL 查询分析器实现的。
具体功能实现模块
代码模块
/*******************************
* 当点击上班按钮时执行此方法 *
* *****************************/
private void btnShangBan_Click(object sender, System.EventArgs e)
{
string id,name="",selSql,selSql2,selSql3,insertSql,strToday,strTime,strPwd="",strHour,strMinute,strCiDao,strKuangGong;
string strYear,strMon;
int count=0;
id=ddId.SelectedItem.Text.Trim();
strToday=System.DateTime.Today.ToShortDateString();
strTime=System.DateTime.Now.ToShortTimeString();
strHour=System.DateTime.Now.Hour.ToString();
strMinute=System.DateTime.Now.Minute.ToString();
strYear=System.DateTime.Now.Year.ToString();
strMon=System.DateTime.Now.Month.ToString();
selSql="select name from usermessage where id='"+id+"'";
selSql2="select name from kaoqin where id='"+id+"' and kqdate='"+strToday+"'";
selSql3="select password from usermessage where id='"+id+"'";
if(txtName.Text.Equals(""))
{
info.Text="请选择用户编号!";
}
else
{
con.Open();
com=new OleDbCommand(selSql3,con);
reader=com.ExecuteReader();
while(reader.Read())
{
strPwd=reader.GetString(0);
}
reader.Close();
com.Dispose();
con.Close();
if(txtPwd.Text.Equals(strPwd))
{
con.Open();
com=new OleDbCommand(selSql2,con);
reader=com.ExecuteReader();
while(reader.Read())
{
count++;
}
reader.Close();
com.Dispose();
con.Close();
if(count==0)
{
con.Open();
com=new OleDbCommand(selSql,con);
reader=com.ExecuteReader();
while(reader.Read())
{
name=reader.GetString(0);
}
reader.Close();
com.Dispose();
con.Close();
if(System.Convert.ToInt32(strHour)>9 || (System.Convert.ToInt32(strHour)==9 && System.Convert.ToInt32(strMinute)>0))
{
strKuangGong="旷工";
strCiDao="否";
}
else if(System.Convert.ToInt32(strHour)>8 || (System.Convert.ToInt32(strHour)==8 && System.Convert.ToInt32(strMinute)>30))
{
strCiDao="迟到";
strKuangGong="0";
}
else
{
strKuangGong="0";
strCiDao="否";
}
insertSql="insert into kaoqin values('"+id+"','"+name+"','"+strToday+"','"+strTime+"','0','"+strCiDao+"',' ',' ',' ','"+strKuangGong+"','"+strYear+"','"+strMon+"')";
con.Open();
com=new OleDbCommand(insertSql,con);
com.ExecuteNonQuery();
com.Dispose();
con.Close();
info.Text="考勤成功!";
}
else
{
info.Text="系统已经记录您的考勤信息,不能重新记录!";
}
}
else
{
info.Text="用户密码错误!";
}
}
con.Close();
}
上班实现模块
/******************************
* 当点击下班按钮时执行此方法*
* ****************************/
private void btnXiaBan_Click(object sender, System.EventArgs e)
{
string id,selSql,selSql2,selSql3,selSql4,selSql5,strPwd="",insertSql,strToday,strTime,strHour,strMinute,strZaoTui,strKuangGong;
int count=0,count2=0,count3=0,count4=0;
id=ddId.SelectedItem.Text.Trim();
strToday=System.DateTime.Today.ToShortDateString();
strTime=System.DateTime.Now.ToShortTimeString();
strHour=System.DateTime.Now.Hour.ToString();
strMinute=System.DateTime.Now.Minute.ToString();
selSql="select name from kaoqin where id='"+id+"' and kqdate='"+strToday+"' and lgdate='0'";
selSql2="select name from kaoqin where id='"+id+"' and kqdate='"+strToday+"'";
selSql3="select password from usermessage where id='"+id+"'";
selSql4="select name from kaoqin where id='"+id+"' and dgdate='0' and kqdate='"+strToday+"'";
selSql5="select name from kaoqin where id='"+id+"' and kg='旷工'";
if(txtName.Text.Equals(""))
{
info.Text="请选择用户编号!";
}
else
{
con.Open();
com=new OleDbCommand(selSql3,con);
reader=com.ExecuteReader();
while(reader.Read())
{
strPwd=reader.GetString(0);
}
reader.Close();
com.Dispose();
con.Close();
if(txtPwd.Text.Equals(strPwd))
{
con.Open();
com=new OleDbCommand(selSql4,con);
reader=com.ExecuteReader();
while(reader.Read())
{
count3++;
}
reader.Close();
com.Dispose();
con.Close();
if(count3!=0)
{
info.Text="系统没有记录您今天的上班信息,因此不能记录您的下班信息!";
}
else
{
con.Open();
com=new OleDbCommand(selSql2,con);
reader=com.ExecuteReader();
while(reader.Read())
{
count2++;
}
reader.Close();
com.Dispose();
con.Close();
if(count2==0)
{
info.Text="系统没有记录您今天的上班信息,因此不能记录您的下班信息!";
}
else
{
con.Open();
com=new OleDbCommand(selSql,con);
reader=com.ExecuteReader();
while(reader.Read())
{
count++;
}
reader.Close();
com.Dispose();
con.Close();
if(count!=0)
{
con.Open();
com=new OleDbCommand(selSql5,con);
reader=com.ExecuteReader();
while(reader.Read())
{
count4++;
}
reader.Close();
com.Dispose();
con.Close();
if(count4==0)
{
if(System.Convert.ToInt32(strHour)<17)
{
strKuangGong="旷工";
strZaoTui="否";
}
else if(System.Convert.ToInt32(strHour)==17 && System.Convert.ToInt32(strMinute)<30)
{
strZaoTui="早退";
strKuangGong=" ";
}
else
{
strKuangGong=" ";
strZaoTui="否";
}
insertSql="update kaoqin set lgdate='"+strTime+"',zt='"+strZaoTui+"',kg='"+strKuangGong+"',cd='否' where id='"+id+"' and kqdate='"+strToday+"'";
con.Open();
com=new OleDbCommand(insertSql,con);
com.ExecuteNonQuery();
com.Dispose();
con.Close();
info.Text="考勤成功!";
}
else
{
string insert="update kaoqin set lgdate='"+strTime+"' where id='"+id+"' and kqdate='"+strToday+"'";
con.Open();
com=new OleDbCommand(insert,con);
com.ExecuteNonQuery();
com.Dispose();
con.Close();
info.Text="考勤成功!";
}
}
else
{
info.Text="系统已经记录您的考勤信息,不能重新记录!";
}
}
}
}
else
{
info.Text="用户密码错误!";
}
}
con.Close();
}
事假实现模块
/******************************
* 当点击事假按钮时执行此方法*
* ****************************/
private void btnShiJia_Click(object sender, System.EventArgs e)
{
string id,selSql,selSql2,strPwd="",insertSql,strToday,strTime,strHour,strMinute,strYear,strMon;
int count=0;
id=ddId.SelectedItem.Text.Trim();
strToday=System.DateTime.Today.ToShortDateString();
strTime=System.DateTime.Now.ToShortTimeString();
strHour=System.DateTime.Now.Hour.ToString();
strMinute=System.DateTime.Now.Minute.ToString();
strYear=System.DateTime.Now.Year.ToString();
strMon=System.DateTime.Now.Month.ToString();
selSql="select password from usermessage where id='"+id+"'";
selSql2="select name from kaoqin where id='"+id+"' and kqdate='"+strToday+"'";
insertSql="insert into kaoqin values('"+id+"','"+txtName.Text+"','"+strToday+"','0','0','否','否',' ','事假',' ','"+strYear+"','"+strMon+"')";
if(txtName.Text.Equals(""))
{
info.Text="请选择用户编号!";
}
else
{
con.Open();
com=new OleDbCommand(selSql,con);
reader=com.ExecuteReader();
while(reader.Read())
{
strPwd=reader.GetString(0);
}
reader.Close();
com.Dispose();
con.Close();
if(txtPwd.Text.Equals(strPwd))
{
con.Open();
com=new OleDbCommand(selSql2,con);
reader=com.ExecuteReader();
while(reader.Read())
{
count++;
}
reader.Close();
com.Dispose();
con.Close();
if(count==0)
{
con.Open();
com=new OleDbCommand(insertSql,con);
com.ExecuteNonQuery();
com.Dispose();
con.Close();
info.Text="考勤成功!";
}
else
{
info.Text="系统已经记录您的考勤信息,不能重新记录";
}
}
else
{
info.Text="用户密码错误!";
}
}
con.Close();
}
病假实现模块
/******************************
* 当点击病假按钮时执行此方法*
* ****************************/
private void btnBingJia_Click(object sender, System.EventArgs e)
{
string id,selSql,selSql2,strPwd="",insertSql,strToday,strTime,strHour,strMinute,strYear,strMon;
int count=0;
id=ddId.SelectedItem.Text.Trim();
strToday=System.DateTime.Today.ToShortDateString();
strTime=System.DateTime.Now.ToShortTimeString();
strHour=System.DateTime.Now.Hour.ToString();
strMinute=System.DateTime.Now.Minute.ToString();
strYear=System.DateTime.Now.Year.ToString();
strMon=System.DateTime.Now.Month.ToString();
selSql="select password from usermessage where id='"+id+"'";
selSql2="select name from kaoqin where id='"+id+"' and kqdate='"+strToday+"'";
insertSql="insert into kaoqin values('"+id+"','"+txtName.Text+"','"+strToday+"','0','0','否','否','病假',' ',' ','"+strYear+"','"+strMon+"')";
if(txtName.Text.Equals(""))
{
info.Text="请选择用户编号!";
}
else
{
con.Open();
com=new OleDbCommand(selSql,con);
reader=com.ExecuteReader();
while(reader.Read())
{
strPwd=reader.GetString(0);
}
reader.Close();
com.Dispose();
con.Close();
if(txtPwd.Text.Equals(strPwd))
{
con.Open();
com=new OleDbCommand(selSql2,con);
reader=com.ExecuteReader();
while(reader.Read())
{
count++;
}
reader.Close();
com.Dispose();
con.Close();
if(count==0)
{
con.Open();
com=new OleDbCommand(insertSql,con);
com.ExecuteNonQuery();
com.Dispose();
con.Close();
info.Text="考勤成功!";
}
else
{
info.Text="系统已经记录您的考勤信息,不能重新记录";
}
}
else
{
info.Text="用户密码错误!";
}
}
con.Close();
}
旷课实现模块
/******************************
* 当点击旷工按钮时执行此方法*
* ****************************/
private void Button1_Click(object sender, System.EventArgs e)
{
string id,selSql,selSql2,strPwd="",insertSql,strToday,strTime,strHour,strMinute,strYear,strMon;
int count=0;
id=ddId.SelectedItem.Text.Trim();
strToday=System.DateTime.Today.ToShortDateString();
strTime=System.DateTime.Now.ToShortTimeString();
strHour=System.DateTime.Now.Hour.ToString();
strMinute=System.DateTime.Now.Minute.ToString();
strYear=System.DateTime.Now.Year.ToString();
strMon=System.DateTime.Now.Month.ToString();
selSql="select password from usermessage where id='"+id+"'";
selSql2="select name from kaoqin where id='"+id+"' and kqdate='"+strToday+"'";
insertSql="insert into kaoqin values('"+id+"','"+txtName.Text+"','"+strToday+"','0','0','否','否',' ',' ','旷工','"+strYear+"','"+strMon+"')";
if(txtName.Text.Equals(""))
{
info.Text="请选择用户编号!";
}
else
{
con.Open();
com=new OleDbCommand(selSql,con);
reader=com.ExecuteReader();
while(reader.Read())
{
strPwd=reader.GetString(0);
}
reader.Close();
com.Dispose();
con.Close();
if(txtPwd.Text.Equals(strPwd))
{
con.Open();
com=new OleDbCommand(selSql2,con);
reader=com.ExecuteReader();
while(reader.Read())
{
count++;
}
reader.Close();
com.Dispose();
con.Close();
if(count==0)
{
con.Open();
com=new OleDbCommand(insertSql,con);
com.ExecuteNonQuery();
com.Dispose();
con.Close();
info.Text="考勤成功!";
}
else
{
info.Text="系统已经记录您的考勤信息,不能重新记录";
}
}
else
{
info.Text="用户密码错误!";
}
}
con.Close();
}
}
}
15、任务概述
15、1目标
调试程序的正确性,对需要改进的地方进行调整,确保程序与需求分析相匹配,对以前的设计程序成果做一个书面总结。
16、运行环境
1)单机运行
数据库:SQL 20##
操作系统:WIN98/2000/ME/XP/NT/2003
2)联网运行
数据库:MS SQL SERVER 2000以上企业版/标准版
工作站操作系统:WIN98/2000/ME/XP/NT
服务器操作系统:WINDOW NT/2000/2003 SERVER
17、测试环境
18、测试时间、地点
时间:3月27
地点:B407
19、测试内容说明
19、1测试方案
在Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。
在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。
19、2需要测试内容说明
程序的正确性,数据库构架的合适,是否能实现各项要求对员工信息的增、删、改、查,实现考勤管理所需的各种功能。
19、3测试准备工作
首先考虑你性能测试的目标是什么,需要哪些人员协助你才能完成,然后协调相关人员(DBA、网管、开发人员等),保证在真正开展过程中能有效得到他们的协助和支持,Cpu是否有足够的处理能力,安装的操作系统是否符合你的要求以及网络(带宽、可使用的有效ip地址个数);服务器的配置;当前测试环境的局限性(无法模拟的测试环境都有哪些)等。
20、功能测试用例设计
20、1公用测试用例
(1) 对软件需求规格说明中的功能要求进行划分(层层分解与展开),分解成具体的、相对独立的基本功能。(2) 根据基本功能的质量需求,找出影响其功能实现的操作对象和外部因素,每个因素的取值可以看作水平,多个取值就存在多个水平(3) 确定待测试软件中所有因素及其权值,这是测试用例设计的关键,确保全面、准确。权值是依据各因素的影响范围、发生的频率和质量的需求来确定的。(4) 加权筛选,生成因素分析表。
20、2系统登录及界面
21、性能测试设计
21、1恢复测试
恢复测试主要检查系统的容错能力。当系统出错时,能否在指定时间间隔内修正错误并重新启动系统。恢复测试首先要采用各种办法强迫系统失败,然后验证系统是否能尽快恢复。对于自动恢复需验证重新初始化(reinitialization)、检查点(checkpointing mechanisms)、数据恢复(data recovery)和重新启动 (restart)等机制的正确性;对于人工干预的恢复系统,还需估测平均修复时间,确定其是否在可接受的范围内。
21、2安全性测试
数据库的安全性就是要保证数据库中数据的安全,防止未授权用户随意修改数据库中的数据,确保数据的安全。在大多数数据库管理系统中,主要是通过许可来保证数据库的安全性。
22、系统测试评价
在测试之前由于对于ASP连接数据库的不熟悉,会出现数据库连接错误致使程序无法运行的情况,但是在“控制面板-管理工具-ODBC数据源”中设置了对应的数据源之后程序与数据库的连接则没有再出现错误。本次系统测试完成了所要求的任务。
1、对员工当天上班信息的录入存入。
2、下班时间打卡信息录入。
3、考勤信息的删除。
4、考勤信息修改。
在数据库中对信息进行存方便搜索删除,修改等活动。
23、小结
该系统为简单的考勤系统,有上下班、请假的基本管理,可以通过后台进行人员和部门的管理。工具比较简单,部分功能还在完善中大体实现了最单的员工信息记录。