一、实现登录功能
1、界面展示
2、利用代码链接至数据库 并且从数据库中查询账号名称与密码来判断登陆的是管理员还是普通员工,或者是没有注册的账号就返回错误信息。
3、关键代码
{
String connStr = ConfigurationManager.ConnectionStrings["Attendance"].ConnectionString;
SqlConnection sqlConn = new SqlConnection(connStr);
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.tb_User.Text.Trim()));
cmd.Parameters.Add(new SqlParameter("@pwd", this.tb_Password.Text.Trim()));
SqlDataReader dr = cmd.ExecuteReader();
// 如果从数据库中查询到记录,则表示可以登录
if (dr.HasRows)
{
dr.Read();
UserInfo.userId = int.Parse(dr["ID"].ToString());
UserInfo.userPwd = dr["PASSWORD"].ToString();
UserInfo.userType = dr["ROLE"].ToString();
MessageBox.Show(UserInfo.userType + "登录成功");
if (UserInfo.userType == "普通員工")
{
// 显示收银员主界面
MainFormUser formUser = new MainFormUser();
formUser.Show();
// 隐藏登录界面
this.Hide();
}
if (UserInfo.userType == "管理員")
{
// 显示库管员主界面
MainFormAdmin formAdmin = new MainFormAdmin();
formAdmin.Show();
// 隐藏登录界面
this.Hide();
}
}
else
{
MessageBox.Show("用户名或密码错误", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception exp)
{
MessageBox.Show("访问数据库错误:" + exp.Message);
}
finally
{
sqlConn.Close();
}
}
3、功能
通过代码连接数据库,并在数据库中验证数据是否正确,若正确则读取相关信息,若错误则提示用户名或密码错误,若数据库连接失败则提示访问数据库错误。
二、注册
1、窗口展示
2、由管理员进入来给为注册的普通员工注册新的账号
3、关键代码
{
String id = this.tb_Id.Text.Trim();
String name = this.tb_Name.Text.Trim();
String password = this.tb_Password.Text.Trim();
String sex = this.tb_Sex.Text.Trim();
String branch = this.tb_Branch.Text.Trim();
String role = this.tb_Role.Text.Trim();
float price = 0; /* 商品价格 */
try
{
price = float.Parse(this.tb_Password.Text.Trim());
}
catch
{
MessageBox.Show("价格解析有误");
this.tb_Password.Focus(); /* 光标定位到输入价格的地方 */
this.tb_Password.SelectAll(); /* 全选文字,以提示出错的地方 */
return;
}
// 更新数据库
String connStr = ConfigurationManager.ConnectionStrings["Attendance"].ConnectionString;
SqlConnection sqlConn = new SqlConnection(connStr);
try
{
// 连接数据库
sqlConn.Open();
// 构造命令
String sqlStr = "insert into EMPLOYEE(ID, NAME, PASSWORD, SEX, BRANCH, ROLE) values(@id, @name, @password, @sex, @branch, @role)";
SqlCommand cmd = new SqlCommand(sqlStr, sqlConn);
// SQL字符串参数赋值
cmd.Parameters.Add(new SqlParameter("@id", id));
cmd.Parameters.Add(new SqlParameter("@name", name));
cmd.Parameters.Add(new SqlParameter("@password", password));
cmd.Parameters.Add(new SqlParameter("@sex", sex));
cmd.Parameters.Add(new SqlParameter("@branch", branch));
cmd.Parameters.Add(new SqlParameter("@role", role));
// 将命令发送给数据库
int res = cmd.ExecuteNonQuery();
// 根据返回值判断是否插入成功
if (res != 0)
{
MessageBox.Show("信息录入成功");
}
else
{
MessageBox.Show("信息录入失败");
}
}
catch (Exception exp)
{
MessageBox.Show("访问数据库错误:" + exp.Message);
}
finally
{
sqlConn.Close();
}
}
4、功能
通过连接数据库,将所需上传的数据上传至数据库中,上传过程会自动根据数据类型填入数据表中,若成功则显示信息录入成功,失败则显示录入失败。
三、打卡
1、界面展示
2、关键代码及其功能
自动获取串口列表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ServiceForm_Load(object sender, EventArgs e)
{
// TODO: 在下拉列表中列出本机所有串口
string[] ArryPort = SerialPort.GetPortNames();
co###2mboBoxCOMList.Items.Clear();
for (int i = 0; i < ArryPort.Length; i++)
{
comboBoxCOMList.Items.Add(ArryPort[i]);
}
}
打开或关闭串口
/// 打开或关闭串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonOpenCOM_Click(object sender, EventArgs e)
{
// 串口已打开,此时需要关闭
if (serialPort1.IsOpen)
{
serialPort1.Close();
this.toolStripStatusLabel1.Text = "已关闭串口" + serialPort1.PortName.ToString();
buttonOpenCOM.Text = "打开";
return;
}
// 否则打开串口
else
{
serialPort1.PortName = comboBoxCOMList.Text;
初始化串口数据并发送接收数据
{
serialPort1.BaudRate = 115200;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
}
try
{
serialPort1.Open();
this.toolStripStatusLabel1.Text = "已打开串口" + serialPort1.PortName.ToString();
buttonOpenCOM.Text = "关闭";
}
catch (Exception ex)
{
this.toolStripStatusLabel1.Text = "打开串口失败,原因:" + ex.Message;
return;
}
}
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bt_Send_Click(object sender, EventArgs e)
{
try
{
// TODO: 将`待发送数据`发送出去
serialPort1.Write(tbWrite.Text);
}
catch (Exception exp)
{
MessageBox.Show(exp.ToString());
}
}
/// <summary>
/// 接收数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
// TODO: 接收数据,并在`接收数据`区域显示出来
tbRead.Text = serialPort1.ReadExisting();
}
catch (Exception exp)
{
MessageBox.Show(exp.ToString());
}
}
清空数据并关闭窗口
/// 清空接收区域
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bt_Clear_Click(object sender, EventArgs e)
{
// TODO: 清空接收区域
}
/// <summary>
/// 窗口关闭时,要关闭串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ServiceForm_FormClosing(object sender, FormClosingEventArgs e)
{
// 如果关闭窗口时,串口仍然为打开状态,则需要关闭串口
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
}
四、查询与统计
1、界面展示
2、在员工和管理员界面中查询个人的考勤记录并且点击详情中的查看可以查到具体的打卡记录和出勤情况。
2、关键代码及主要功能
查询数据并修改删除数据
private void bt_Query_Click(object sender, EventArgs e)
{
String connStr = ConfigurationManager.ConnectionStrings["Attendance"].ConnectionString;
SqlConnection sqlConn = new SqlConnection(connStr);
try
{
// 连接数据库
sqlConn.Open();
// 构造命令发送给数据库
String sqlStr = "select * from record where date>=@start and date<=@end and employee_id = @id";
SqlCommand cmd = new SqlCommand(sqlStr, sqlConn);
cmd.Parameters.Add(new SqlParameter("@start", this.dtp_Start.Value.ToShortDateString()));
cmd.Parameters.Add(new SqlParameter("@end", this.dtp_End.Value.ToShortDateString()));
cmd.Parameters.Add(new SqlParameter("@id", UserInfo.userId));
SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand = cmd;
// 将DataSet和DataAdapter绑定
DataSet ds = new DataSet();
// 自定义一个表(MyGoods)来标识数据库的GOODS表
adp.Fill(ds, "MyGoods");
// 指定DataGridView的数据源为DataSet的MyGoods表
this.dgv_Goods.DataSource = ds.Tables["MyGoods"];
}
catch (Exception exp)
{
MessageBox.Show("访问数据库错误:" + exp.Message);
}
finally
{
sqlConn.Close();
}
}
// 数据修改,删除
private void dgv_Goods_CellContentClick(object sender, DataGridViewCellEventArgs e)