一. 需求说明书
1.需求概述
-
1.1 项目背景
该考勤管理系统是为了解决员工考勤管理而设计的,目的是建立一个能够实现企业考勤管理系统的智能化管理,提高考勤管理系统效率,工作人员能够在各个岗位上的工作状态得到及时的反馈,因而在一个系统内实现尽可能多的功能,满足工作环境的各种需求。
-
1.2 系统目的
- (1)提供简单、方便的操作
- (2)通过考勤管理系统实现,使企业的考勤管理更加科学规范
- (3)提高考勤管理的透明度和效率。
2.功能模块图
3.其他需求
有以下四点
①具有友好的用户界面
②人机界面友好,操作简单
③界面适应屏幕
④界面加上公司LOGO
4.系统网络拓扑图
5.系统不足之处
该软件在c#上开发所以只能运行在windows系统上,并且windows要有.NET 框架。#一.识别实体
1.员工:工号、姓名、性别、部门、年龄、职位
2.打卡机:编号、位置
二.考勤系统E-R图
三.数据表
四.数据序表
1.员工
2.打卡机
3.打卡
五.考勤系统功能实现——登录
5.1效果图
5.2实现代码
try
{
// 连接数据库
sqlConn.Open();
// 构造命令发送给数据库
String sqlStr = "select * from employee where ID=@id and PASSWORD=@pwd";
SqlCommand cmd = new SqlCommand(sqlStr, sqlConn);
// 注意是用用户ID登录,而不是用户名,用户名可能会重复
cmd.Parameters.Add(new SqlParameter("@id", this.textBox1.Text.Trim()));
cmd.Parameters.Add(new SqlParameter("@pwd", this.textBox2.Text.Trim()));
SqlDataReader dr = cmd.ExecuteReader();
// 如果从数据库中查询到记录,则表示可以登录
if (dr.HasRows)
{
dr.Read();
staffinfo.userId = int.Parse(dr["ID"].ToString());
staffinfo.userName = dr["NAME"].ToString();
staffinfo.userPwd = dr["PASSWORD"].ToString();
staffinfo.usergender = dr["GENDER"].ToString();
staffinfo.userRole = dr["ROLE"].ToString();
MessageBox.Show(staffinfo.userRole + "登录成功");
if (staffinfo.userRole == "职员")
{
// 显示收银员主界面
Form3 Form3 = new Form3();
Form3.Show();
// 隐藏登录界面
this.Hide();
}
if (staffinfo.userRole == "管理员")
{
// 显示库管员主界面
Form4 Form4 = new Form4();
Form4.Show();
// 隐藏登录界面
this.Hide();
}
}
else
{
MessageBox.Show("用户名或密码错误", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception exp)
{
MessageBox.Show("访问数据库错误:" + exp.Message);
}
finally
{
sqlConn.Close();
}
}
5.3注意事项
(1)连接到数据库, 写入数据
(2)用用户ID登录,而不是用户名,用户名可能会重复
六.考勤系统功能实现——注册
6.1效果图
6.2实现代码
private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
}
private void 统计打卡记录ToolStripMenuItem_Click(object sender, EventArgs e)
{
zhuce recordForm = new zhuce();
recordForm.Show();
}
6.3注意事项
(1)连接到数据库,实现注册界面登录 写入数据
七.考勤系统功能实现——打卡
7.1效果图
7.2实现代码
第一步: // 初始化串口参数
serialPort1.DataBits = 8;
serialPort1.BaudRate = 115200;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
第二步: /// 读取卡号
///
///
///
private void bt_Reader_Click(object sender, EventArgs e)
{
// 检测端口是否开启
if (!serialPort1.IsOpen)
{
MessageBox.Show("串口未打开!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
第三步:// 寻卡
cards = SearchCards();
// 判断到的卡片数量
if (!(cards.Count > 0))
{
MessageBox.Show("未寻到卡!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
string number = ReadSingleBlock(
ISO15693CardHandler.CovertEndian(cards[0].ID), "00"
);
// 判断是否读取成功
if (number.Equals("-1"))
{
MessageBox.Show("读取失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
第四步: // 判断是否寻到卡
if (!(timerCards.Count > 0))
{
lastNumber = "";
return;
}
string number = ReadSingleBlock(
ISO15693CardHandler.CovertEndian(timerCards[0].ID), "00"
);
第五步: // 判断是否与上一个卡一致
if (lastNumber.Equals(number))
{
return;
}
lastNumber = number;
}
第六步: // 记录
recordSQL(number);
}
7.3注意事项
(1)记得连接到数据库
八.考勤系统功能实现——查询
8.1效果图
8.2实现代码
// 连接字符串,注意与实际环境保持一致
String connStr = ConfigurationManager.ConnectionStrings["kaoqin"].ConnectionString;
SqlConnection sqlConn = new SqlConnection(connStr);
try
{
// 连接数据库
sqlConn.Open();
// 构造命令
String sqlStr = "select * from record ";
// 添加查询条件
if (!this.comboBox1.Text.Trim().Equals(""))
{
sqlStr += "where employee_id='"+ this.comboBox1.Text.Trim() + "'";
}
SqlCommand cmd = new SqlCommand(sqlStr, sqlConn);
// 将该查询过程绑定到DataAdapter
SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand = cmd;
// 将DataSet和DataAdapter绑定
DataSet ds = new DataSet();
// 自定义一个表(MyGoods)来标识数据库的GOODS表
adp.Fill(ds, "mydata");
// 指定DataGridView的数据源为DataSet的MyGoods表
this.dataGridView1.DataSource = ds.Tables["mydata"];
}
catch (Exception exp)
{
MessageBox.Show("访问数据库错误:" + exp.Message);
}
finally
{
sqlConn.Close();
}
}
}
}
8.3注意事项
(1)连接到数据库,访问数据库数据
(2)选择条件,查询考勤记录
九.考勤系统功能实现——统计
9.1效果图
9.2实现代码
try
{
// 连接数据库
sqlConn.Open();
// 构造命令,统计一个部门中有哪些员工工作时间不满540分钟
String sqlStr = @"select t4.department, t4.name, t3.date, t3.start_time, t3.end_time, t3.diff from (
select t1.employee_id, t1.date, t1.time as start_time, t2.time as end_time, datediff(n,t1.time,t2.time) as diff
from record t1
inner join record t2
on t1.date = t2.date
and t1.employee_id=t2.employee_id
and t1.machine_id=1
and t2.machine_id=2
and t1.date>=@start
and t1.date<=@end
) t3, employee t4 where t3.employee_id=t4.id and t3.diff<540 and t4.department=@department";
SqlCommand cmd = new SqlCommand(sqlStr, sqlConn);
cmd.Parameters.Add(new SqlParameter("@start", this.start));
cmd.Parameters.Add(new SqlParameter("@end", this.end));
cmd.Parameters.Add(new SqlParameter("@department", this.department));
// 将该查询过程绑定到DataAdapter
SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand = cmd;
// 将DataSet和DataAdapter绑定
DataSet ds = new DataSet();
// 自定义一个表(MyAttendance)来标识数据库的record表
adp.Fill(ds, "MyAttendance");
// 指定DataGridView的数据源为DataSet的record表
this.dgv_Detail.DataSource = ds.Tables["MyAttendance"];
}
catch (Exception exp)
{
MessageBox.Show("访问数据库错误:" + exp.Message);
}
finally
{
sqlConn.Close();
}
}
9.3注意事项
(1)连接到数据库,写出合适的选择语句,列出必要条件
十.项目发布
10.1过程步骤
第一步:编写出格式第二步:在相关界面放入此代码