考勤系統(tǒng)功能實(shí)現(xiàn)

一、實(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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容