一、實(shí)現(xiàn)登錄功能
1、界面展示

普通員工登錄

登錄成功界面展示

管理員登陸

登陸成功界面展示
2、利用代碼鏈接至數(shù)據(jù)庫 并且從數(shù)據(jù)庫中查詢賬號名稱與密碼來判斷登陸的是管理員還是普通員工,或者是沒有注冊的賬號就返回錯誤信息。
3、關(guān)鍵代碼
{
String connStr = ConfigurationManager.ConnectionStrings["Attendance"].ConnectionString;
SqlConnection sqlConn = new SqlConnection(connStr);
try
{
// 連接數(shù)據(jù)庫
sqlConn.Open();
// 構(gòu)造命令發(fā)送給數(shù)據(jù)庫
String sqlStr = "select * from EMPLOYEE where ID=@id and PASSWORD=@pwd";
SqlCommand cmd = new SqlCommand(sqlStr, sqlConn);
// 注意是用用戶ID登錄,而不是用戶名,用戶名可能會重復(fù)
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();
// 如果從數(shù)據(jù)庫中查詢到記錄,則表示可以登錄
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("訪問數(shù)據(jù)庫錯誤:" + exp.Message);
}
finally
{
sqlConn.Close();
}
}
3、功能
通過代碼連接數(shù)據(jù)庫,并在數(shù)據(jù)庫中驗證數(shù)據(jù)是否正確,若正確則讀取相關(guān)信息,若錯誤則提示用戶名或密碼錯誤,若數(shù)據(jù)庫連接失敗則提示訪問數(shù)據(jù)庫錯誤。
二、注冊
1、窗口展示

注冊員工窗口
2、由管理員進(jìn)入來給為注冊的普通員工注冊新的賬號
3、關(guān)鍵代碼
{
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(); /* 光標(biāo)定位到輸入價格的地方 */
this.tb_Password.SelectAll(); /* 全選文字,以提示出錯的地方 */
return;
}
// 更新數(shù)據(jù)庫
String connStr = ConfigurationManager.ConnectionStrings["Attendance"].ConnectionString;
SqlConnection sqlConn = new SqlConnection(connStr);
try
{
// 連接數(shù)據(jù)庫
sqlConn.Open();
// 構(gòu)造命令
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字符串參數(shù)賦值
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));
// 將命令發(fā)送給數(shù)據(jù)庫
int res = cmd.ExecuteNonQuery();
// 根據(jù)返回值判斷是否插入成功
if (res != 0)
{
MessageBox.Show("信息錄入成功");
}
else
{
MessageBox.Show("信息錄入失敗");
}
}
catch (Exception exp)
{
MessageBox.Show("訪問數(shù)據(jù)庫錯誤:" + exp.Message);
}
finally
{
sqlConn.Close();
}
}
4、功能
通過連接數(shù)據(jù)庫,將所需上傳的數(shù)據(jù)上傳至數(shù)據(jù)庫中,上傳過程會自動根據(jù)數(shù)據(jù)類型填入數(shù)據(jù)表中,若成功則顯示信息錄入成功,失敗則顯示錄入失敗。
三、打卡
1、界面展示

打卡界面一

打卡界面二
2、關(guān)鍵代碼及其功能
自動獲取串口列表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ServiceForm_Load(object sender, EventArgs e)
{
// TODO: 在下拉列表中列出本機(jī)所有串口
string[] ArryPort = SerialPort.GetPortNames();
co###2mboBoxCOMList.Items.Clear();
for (int i = 0; i < ArryPort.Length; i++)
{
comboBoxCOMList.Items.Add(ArryPort[i]);
}
}
打開或關(guān)閉串口
/// 打開或關(guān)閉串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonOpenCOM_Click(object sender, EventArgs e)
{
// 串口已打開,此時需要關(guān)閉
if (serialPort1.IsOpen)
{
serialPort1.Close();
this.toolStripStatusLabel1.Text = "已關(guān)閉串口" + serialPort1.PortName.ToString();
buttonOpenCOM.Text = "打開";
return;
}
// 否則打開串口
else
{
serialPort1.PortName = comboBoxCOMList.Text;
初始化串口數(shù)據(jù)并發(fā)送接收數(shù)據(jù)
{
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 = "關(guān)閉";
}
catch (Exception ex)
{
this.toolStripStatusLabel1.Text = "打開串口失敗,原因:" + ex.Message;
return;
}
}
}
/// <summary>
/// 發(fā)送數(shù)據(jù)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bt_Send_Click(object sender, EventArgs e)
{
try
{
// TODO: 將`待發(fā)送數(shù)據(jù)`發(fā)送出去
serialPort1.Write(tbWrite.Text);
}
catch (Exception exp)
{
MessageBox.Show(exp.ToString());
}
}
/// <summary>
/// 接收數(shù)據(jù)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
// TODO: 接收數(shù)據(jù),并在`接收數(shù)據(jù)`區(qū)域顯示出來
tbRead.Text = serialPort1.ReadExisting();
}
catch (Exception exp)
{
MessageBox.Show(exp.ToString());
}
}
清空數(shù)據(jù)并關(guān)閉窗口
/// 清空接收區(qū)域
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bt_Clear_Click(object sender, EventArgs e)
{
// TODO: 清空接收區(qū)域
}
/// <summary>
/// 窗口關(guān)閉時,要關(guān)閉串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ServiceForm_FormClosing(object sender, FormClosingEventArgs e)
{
// 如果關(guān)閉窗口時,串口仍然為打開狀態(tài),則需要關(guān)閉串口
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
}
四、查詢與統(tǒng)計
1、界面展示

管理員查詢統(tǒng)計界面

員工查詢統(tǒng)計界面
2、在員工和管理員界面中查詢個人的考勤記錄并且點(diǎn)擊詳情中的查看可以查到具體的打卡記錄和出勤情況。
2、關(guān)鍵代碼及主要功能
查詢數(shù)據(jù)并修改刪除數(shù)據(jù)
private void bt_Query_Click(object sender, EventArgs e)
{
String connStr = ConfigurationManager.ConnectionStrings["Attendance"].ConnectionString;
SqlConnection sqlConn = new SqlConnection(connStr);
try
{
// 連接數(shù)據(jù)庫
sqlConn.Open();
// 構(gòu)造命令發(fā)送給數(shù)據(jù)庫
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)來標(biāo)識數(shù)據(jù)庫的GOODS表
adp.Fill(ds, "MyGoods");
// 指定DataGridView的數(shù)據(jù)源為DataSet的MyGoods表
this.dgv_Goods.DataSource = ds.Tables["MyGoods"];
}
catch (Exception exp)
{
MessageBox.Show("訪問數(shù)據(jù)庫錯誤:" + exp.Message);
}
finally
{
sqlConn.Close();
}
}
// 數(shù)據(jù)修改,刪除
private void dgv_Goods_CellContentClick(object sender, DataGridViewCellEventArgs e)