第一章系统概述
1.1系统开发的背景与意义
1.1.1系统开发背景
现在不论哪个企业,都要进行考勤,一些企业在考勤管理方面用了大量的人力和财力,不说准确度和可信度如何,其效率很低,而且容易出错,不利于管理。所以人工考勤已经很难再满足企业规范化管理的要求,随着数据库技术的发展和企业信息化建设的进行,使用计算机管理考勤成为一种主流趋势,它不仅为企业减少了人力财力的付出,而且也大大减轻了考勤工作人员的工作量。本文系统的阐述了企业考勤管理设计开发的全过程。包括系统需求调查分析,概念结构设计,逻辑结构设计等部分。
1.1.2 系统开发意义
开发本系统的目的,就是要解决目前企业中关于员工出勤管理中所面临的一系列问题。开发出企业考勤管理系统能有效地提高企业办事效率,解决目前员工出勤管理问题,实现员工请出勤信息和缺勤信息对企业领导透明,使管理人员及时把握员工的情况,及时与员工沟通,提高生产质量。
第二章系统需求分析
2.1系统功能要求
(1)记录每个员工每天所有进入公司的时刻和离开公司的时刻。
(2)每天结束时自动统计当天的工作时间
(3)每天结束时自动统计当天迟到或早退的次数。
(4)对于弹性工作制,每天结束时自动统计当月的工时,并自动算出当月欠缺或富余的时间
(5)每个月末统计该月的工作时间判断是否足够
(6)每个月末统计该月的工作天数并判断是否足够
(7)管理人员查询并修改工作时间(特殊情况下修改)
(8)管理人员账户管理(如设置密码等)
(9)管理人员设定早退及迟到的条件,每个月的工作时间
(10)管理人员设定每个月的工作日期及放假日期
2.2 需求分析概述
实际的管理和记录工作非常需要快速获知各个部门员工的每日出勤情况,以便于及时向高层管理者反映员工的出勤,缺勤情况。目前,由于负责考勤的员工,工作任务比较多,而且还都是重复数据,让工作者没有办法及时的向上报告。工作问题不能及时处理。
针对以上的情况,我们提出企业考勤管理系统,实现网上考勤任务,以减轻考勤人员的工作量。我公司准备开发员工考勤管理系统,完成员工基本信息维护、企业的部门信息维护、企业基本考勤类型的维护、员工考勤的管理、员工考勤的查询与分析。实现人事考勤的需要,包括员工迟到、早退的情况的记录,在每个月底计算工资对员工和对员工进行绩效评估的时候,对员工整个月的考勤记录进行查询和统计。
2.3系统层次划分
毕业设计代做 QQ9361235 80634579博士硕士学生研究生留学生论文代写程序代做软件制作网站开发
图2.1 系统层次图
2
图2.2系统数据流程图
2.5 数据字典
第三章系统总体设计
3.1 系统总体设计目标
经过调查、信息流程分析、数据收集,并结合需求分析,明确了该子系统的功能:
(1)给员工编号,登记其基本信息。
(2)给员工配置信息,天下班时间,每天工作时间
(3)对员工的考勤数据进行登记,并进行每日和月度考勤统计。
(4)对员工的月度考勤统计的结果来核算员工工资和工作放假日期。3.2 系统概念设计
3.2.1 概念模型(E-R图)
图3.1 员工属性图
图3.2刷卡机属性图
图3.3管理员属性图
图4.4 系统E-R 图
3.2.2 关系模式
记录数据(员工号,刷卡机号,上班的时间,下班的时间,每天工作时间)
刷卡机(刷卡机号,刷卡机名称,规格)
统计数据(员工号,刷卡机号,剩余的时间,迟到的次数,早退的次数,工作天数)
管理员(管理员号,姓名,性别,年龄)
员工表(employee)
记录数据表(data_record):
刷卡机表(skj):
统计数据表(statistics_data):
管理员表(Administrator)
第四章数据库系统实现
4.1 系统实现工具简介
4.1.1 PowerDesigner 建模工具简介
提高软件质量,开发周期, 并且使软件更能够适应业务需求的变化,以提高投资回报率,是每个企业所面临的、需要解决的关键问题。软件建模为是提
型、对象模型、和业务流程模型。由于历史原因,面向数据架构,开发以及业务分析的建模工作总是被单独购买,彼此之间没有集成或共享信息。但是,企业不断需要更集成的建模套件,即集成化企业级建模工具,来支持在共享环境下,企业整个架构的不同方面的全面建模。
目前各主要的建模工具厂商如Sybase PowerDesigner, IBM Rational Rose, Computer Associates的ERWin等都在加强各自建模工具的融合与集成。PowerDesigner经过近20年的发展,已经在原有的数据建模上,形成一套完整的集成化企业级建模解决方案。
PowerDesigner系列产品提供了一个完整的建模解决方案,业务或系统分析人员,设计人员,数据库管理员BA和开发人员可以对其裁剪以满足他们的特定的需要;而其模块化的结构为购买和扩展提供了极大的灵活性,从而使开发单位可以根据其项目的规模和范围来使用他们所需要的工具。PowerDesigner 灵活的分析和设计特性允许使用一种结构化的方法有效地创建数据库或数据仓库,而不要求严格遵循一个特定的方法学。PowerDesigner提供了直观的符号表示使数据库的创建更加容易,并使项目组内的交流和通讯标准化,同时能更加简单地向非技术人员展示数据库和应用的设计。
PowerDesigner不仅加速了开发的过程,也向最终用户提供了管理和访问项目的信息的一个有效的结构。它允许设计人员不仅创建和管理数据的结构,而且开发和利用数据的结构针对领先的开发工具环境快速地生成应用对象和数据敏感的组件。开发人员可以使用同样的物理数据模型查看数据库的结构和整理文档,以及生成应用对象和在开发过程中使用的组件。应用对象生成有助于在整个开发生命周期提供更多的控制和更高的生产率。
PowerDesigner是一个功能强大而使用简单工具集,提供了一个复杂的交互环境,支持开发生命周期的所有阶段,从处理流程建模到对象和组件的生成。PowerDesigner产生的模型和应用可以不断地增长,适应并随着你的组织的变化而变化。
PowerDesigner包含六个紧密集成的模块,允许个人和开发组的成员以合算的方式最好地满足他们的需要。这六个模块是:
PowerDesigner ProcessAnalyst,用于数据发现。
PowerDesigner DataArchitect,用于双层,交互式的数据库设计和构造。
PowerDesigner AppModeler,用于物理建模和应用对象及数据敏感组件的生成。
PowerDesigner MetaWorks,用于高级的团队开发,信息的共享和模型的管理。
PowerDesigner WarehouseArchitect,用于数据仓库的设计和实现。
PowerDesigner Viewer,用于以只读的、图形化方式访问整个企业的模型信息。
PowerDesigner 主要包括以下几个功能部分
(1) DataArchitect
这是一个强大的数据库设计工具,使用DataArchitect 可利用实体-关系图为一个信息系统
创建"概念数据模型"-CDM(Conceptual Data Model)。并且可根据CDM 产生基于某一特定
数据库管理系统(例如:Sybase System 11)的"物理数据模型"-PDM(Physical Data Model)。
还可优化PDM,产生为特定DBMS 创建数据库的SQL 语句并可以文件形式存储以便在其他时
刻运行这些SQL 语句创建数据库。另外,DataArchitect还可根据已存在的数据库反向生成
PDM,CDM 及创建数据库的SQL脚本。
(2) ProcessAnalyst
这部分用于创建功能模型和数据流图,创建"处理层次关系"。
(3) AppModeler
为客户/服务器应用程序创建应用模型。
(4) ODBC Administrator
此部分用来管理系统的各种数据源。
(5)XML文件
可以使用工具生成相应的XML文件,或者用XML文件生成相关模型
4.1.2 SQL Server 2000简介
SQL Server 是一个关系数据库管理系统,它最初是由Microsoft Sybase 和Ashton-Tate三家公司共同开发的,于1988 年推出了第一个OS/2 版本。在Windows NT 推出后,Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了。Microsoft 将SQL Server 移植到Windows NT系统上,专注于开发推广SQL Server 的Windows NT 版本;Sybase 则较专注于SQL Server在UNIX 操作系统上的应用。在本书中介绍的是Microsoft SQL Server 以后简称为SQL Server
SQL Server 2000 是Microsoft 公司推出的SQL Server 数据库管理系统的一个版本。该版本继承了SQL Server 7.0 版本的优点同时又比它增加了许多更先进的功能,具有使用方便,可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2000 的大型多处理器的服务器等多种平台使用。
SQL Server 2000 的特性Microsoft® SQL Server? 2000 的特性包括:
(1).Internet 集成。SQL Server 2000 数据库引擎提供完整的XML 支持。它还具有构成最大的Web 站点的数据存储组件所需的可伸缩性、可用性和安全功能。
(2).可伸缩性和可用性。同一个数据库引擎可以在不同的平台上使用,从运行 Microsoft Windows® 98 的便携式电脑,到运行 Microsoft Windows 2000 数据中心版的大型多处理器服务器。
(3).企业级数据库功能。SQL Server 2000 关系数据库引擎支持当今苛刻的数据处理环境所需的功能。数据库引擎充分保护数据完整性,同时将管理上千个并发修改数据库的用户的开销减到最小。
(4).易于安装、部署和使用。 SQL Server 2000 中包括一系列管理和开发工具,这些工具可改进在多个站点上安装、部署、管理和使用 SQL Server 的过程。SQL Server 2000 还支持基于标准的、与 Windows DNA 集成的程序设计模型,使 SQL Server 数据库和数据仓库的使用成为生成强大的可伸缩系统的无缝部分。这些功能使您得以快速交付 SQL Server 应用程序,使客户只需最少的安装和管理开销即可实现这些应用程序。
4.1.2企业考勤管理系统的实现
#include
#include
#include
#include"process.h"
#include
#define MAX_COUNT 30
struct employee
{
int id;
char name[20];
char department[20];
};
struct date /
{
int year;
int month;
int day;
};
struct attendance
{
int id;
int late;
int early;
char name[20];
struct date dat;
};
struct statistic
{
int id;
int late_count;
int early_count;
char name[20];
};
int COUNT=0;
int FLAG_pause=1;
system(“pause”)
struct employee person[MAX_COUNT]; struct data BASE_DATA={2010,3,1}; void input_employee()
{
system("cls");
FILE *fp1,*fp2;
fp1=fopen("information1.txt","w");
fp2=fopen("information2.txt","w");
printf("\t\t\t\t 员工信息\n");
printf("\n\t\t\t\tID\t姓名\t部门\n\t\t\t\t");
fprintf(fp1,"\t\t\t\t 输入员工信息\n");
fprintf(fp1,"\n\t\t\t\tID\t姓名\t部门\n");
scanf("%d%s%s",&temp.id,https://www.wendangku.net/doc/af10773502.html,,temp.department);
while(temp.id!=0)
{
person[COUNT]=temp;
printf("%d",temp.id);
COUNT++;
fprintf(fp1,"\t\t\t\t%d\t%s\t%s\n",temp.id,https://www.wendangku.net/doc/af10773502.html,,temp.department);
fprintf(fp2,"%d\t%s\t%s\n",temp.id,https://www.wendangku.net/doc/af10773502.html,,temp.department);
printf("\t\t\t\t");
scanf("%d%s%s",&temp.id,https://www.wendangku.net/doc/af10773502.html,,temp.department);
}
fclose(fp1);
fclose(fp2);
}
void read_file()
{
FILE *fp;
COUNT=0;
if((fp=fopen("information2.txt","r"))==NULL)
{
printf("cant not open file\n");
exit(1);
}
while(!feof(fp))
{
fscanf(fp,"%d%s%s",&person[COUNT].id,person[COUNT].name, person[COUNT].department);
COUNT++;
}
COUNT--;
fclose(fp);
}
void write_file()
{
int i;
FILE *fp1,*fp2;
fp1=fopen("information1.txt","w+");
{
printf("cant not open file\n");
exit(1);
}
fprintf(fp1,"\t\t\t\t 输入员工信息\n");
printf(fp1,"\n\t\t\t\tID\t姓名\t部门\n");
for(i=0;i { fprintf(fp1,"\t\t\t\t%d\t%s\t%s\n",person[i].id,person[i].name,person[i].depar tment); fprintf(fp2,"%d\t%s\t%s\n",person[i].id,person[i].name,person[i].department); } fclose(fp1); fclose(fp2); } void output_employee() { int i; int id; int choice; char temp[20]; system("cls"); read_file(); printf("\n\t\t\t\t\t输出员工信息\n"); printf("\n\t1.输出全体员工信息\t"); printf("2.按姓名输出员工信息\t"); printf("3.按ID输出员工信息\t"); printf("4.按部门员工信息\t"); printf("5.返回主菜单\n"); printf("\n\t请选择(1~5):\t"); start: scanf("%d",&choice); if(choice<1 || choice>5) { printf("\t输入错误,请重输:\t"); goto start; } switch(choice) { case(1): { printf("\t\t\tID\t姓名\t部门\n"); printf("\t\t\t%d\t%s\t%s\n",person[i].id,person[i].name,person[i].department); break; } case(2): { printf("\t\t\t输入姓名:"); scanf("%s",temp); printf("\t\t\tID\t姓名\t部门\n"); for(i=0;i if(strcmp(person[i].name,temp)==0) printf("\t\t\t%d\t%s\t%s\n",person[i].id,person[i]. name,person[i].department); break; } case(3): { printf("\t\t\t输入ID:"); scanf("%d",&id); printf("\t\t\tID\t姓名\t部门\n"); for(i=0;i { if(person[i].id==id) { printf("\t\t\t%d\t%s\t%s\n",person[i].id,person[i].name, person[i].department); break; } } break; } case(4): { printf("\t\t\t输入部门:"); scanf("%s",temp); printf("\t\t\tID\t姓名\t部门\n"); for(i=0;i if(strcmp(person[i].department,temp)==0) printf("\t\t\t%d\t%s\t%s\n",person[i].id,person[i].name, person[i].department); break; } case(5): break; } void insert_employee(struct employee new_person) { int i; system("cls"); read_file(); i=COUNT; while(person[i].id>new_person.id) { person[i]=person[i-1]; i--; } person[i]=new_person; COUNT++; write_file(); if(FLAG_pause==0) system("pause"); } void delete_employee(int id) { int i; int j; read_file(); system("cls"); for(i=0;i if(person[i].id==id) break; for(j=i;j person[j]=person[j+1]; COUNT--; write_file(); if(FLAG_pause==0) system("pause"); } void edit_employee(int id) { struct employee someone; system("cls"); FLAG_pause=1; delete_employee(id); printf("\t请输入新的员工信息:\n\t\t\tID\t姓名\t部门\n\t\t\t"); scanf("%d%s%s",&someone.id,https://www.wendangku.net/doc/af10773502.html,,someone.department); insert_employee(someone); write_file(); FLAG_pause=0; void management_employee() { int choice; int id; struct employee someone; printf("\n\t\t\t\t\t员工信息管理\n"); printf("\n\t1.输入员工信息\t"); printf("2.输出员工信息\t"); printf("3.插入员工信息\t"); printf("4.修改员工信息\t"); printf("5.删除员工\t"); printf("6.返回主菜单\n"); printf("\n\t请选择(1~6):\t"); start: scanf("%d",&choice); if(choice<1 || choice>6) { printf("\t输入错误,请重输:\t"); goto start; } switch(choice) { case(1): { input_employee(); break; } case(2): { output_employee(); break; } case(3): { printf("\t\t\t插入新员工信息\n"); printf("\t\t\t请输入员工的:\n\t\t\tID\t姓名\t部门\n"); printf("\t\t\t"); scanf("%d%s%s",&someone.id,https://www.wendangku.net/doc/af10773502.html,,someone.department); insert_employee(someone); break; } case(4): { printf("\t\t\t修改员工信息\n"); edit_employee(id); break; } case(5): { printf("\t\t\t删除员工信息\n"); printf("\t请输入要删除的员工ID:\t"); scanf("%d",&id); delete_employee(id); break; } case(6): break; } } int computer(struct data someday) { int i; int days=0; if(someday.month==BASE_DATA.month) days=someday.day-BASE_DATA.day+1; else { for(i=BASE_DATA.month+1;i switch(i) { case 2: days=days+28; case 3: days=days+31; case 4: days=days+30; case 5: days=days+31; case 6: days=days+30; case 7: days=days+31; case 8: days=days+31; case 9: days=days+30; case 10: days=days+31;