C#--C/S--学员管理系统--9--考勤打卡和管理员修改密码
以下是学习笔记:
一,考勤打卡
打卡效果如下:
打卡器:刷卡后,自动回车键
打卡成功:
实现:
1,后台部分:
在DAL--StudentService学员信息访问类添加代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | #region 查询学员【根据班级、学号、卡号】 /// <summary> /// 根据班级名称查询学员信息 /// </summary> /// <param name="className"></param> /// <returns></returns> public List<StudentExt> GetStudentByClass( string className) { string sql = "select StudentName,StudentId,Gender,Birthday,ClassName from Students" ; sql += " inner join StudentClass on Students.ClassId=StudentClass.ClassId" ; sql += " where ClassName='{0}'" ; sql = string .Format(sql, className); SqlDataReader objReader = SQLHelper.GetReader(sql); List<StudentExt> list = new List<StudentExt>(); while (objReader.Read()) { list.Add( new StudentExt() { StudentId = Convert.ToInt32(objReader[ "StudentId" ]), StudentName = objReader[ "StudentName" ].ToString(), Gender = objReader[ "Gender" ].ToString(), Birthday = Convert.ToDateTime(objReader[ "Birthday" ]), ClassName = objReader[ "ClassName" ].ToString() }); } objReader.Close(); return list; } /// <summary> ///根据学号查询学员对象 /// </summary> /// <param name="studentId"></param> /// <returns></returns> public StudentExt GetStudentById( string studentId) { string sql = "select StudentId,StudentName,Gender,Birthday,ClassName,StudentIdNo,PhoneNumber,StudentAddress,CardNo from Students" ; sql += " inner join StudentClass on Students.ClassId=StudentClass.ClassId" ; sql += " where StudentId=" + studentId; SqlDataReader objReader = SQLHelper.GetReader(sql); StudentExt objStudent = null ; if (objReader.Read()) { objStudent = new StudentExt() { StudentId = Convert.ToInt32(objReader[ "StudentId" ]), StudentName = objReader[ "StudentName" ].ToString(), Gender = objReader[ "Gender" ].ToString(), Birthday = Convert.ToDateTime(objReader[ "Birthday" ]), ClassName = objReader[ "ClassName" ].ToString(), CardNo = objReader[ "CardNo" ].ToString(), StudentIdNo = objReader[ "StudentIdNo" ].ToString(), PhoneNumber = objReader[ "PhoneNumber" ].ToString(), StudentAddress = objReader[ "StudentAddress" ].ToString() }; } objReader.Close(); return objStudent; } /// <summary> /// 根据卡号查询学生信息(请思考如何将上面的方法合并,像下面的方法这么简单) /// </summary> /// <param name="CardNo"></param> /// <returns></returns> public StudentExt GetStudentByCardNo( string CardNo) { string whereSql = string .Format( " where CardNo='{0}'" , CardNo); return this .GetStudent(whereSql); } private StudentExt GetStudent( string whereSql) { string sql = "select StudentId,StudentName,Gender,Birthday,ClassName," ; sql += "StudentIdNo,PhoneNumber,StudentAddress,CardNo from Students" ; sql += " inner join StudentClass on Students.ClassId=StudentClass.ClassId " ; sql += whereSql; SqlDataReader objReader = SQLHelper.GetReader(sql); StudentExt objStudent = null ; if (objReader.Read()) { objStudent = new StudentExt() { StudentId = Convert.ToInt32(objReader[ "StudentId" ]), StudentName = objReader[ "StudentName" ].ToString(), Gender = objReader[ "Gender" ].ToString(), Birthday = Convert.ToDateTime(objReader[ "Birthday" ]), ClassName = objReader[ "ClassName" ].ToString(), CardNo = objReader[ "CardNo" ].ToString(), StudentIdNo = objReader[ "StudentIdNo" ].ToString(), PhoneNumber = objReader[ "PhoneNumber" ].ToString(), StudentAddress = objReader[ "StudentAddress" ].ToString() }; } objReader.Close(); return objStudent; } #endregion |
2,前端UI部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | public FrmAttendance() //窗体构造函数 { InitializeComponent(); timer1_Tick( null , null ); //避免时间显示的延迟 } //显示当前时间 private void timer1_Tick( object sender, EventArgs e) { this .lblYear.Text = DateTime.Now.Year.ToString(); this .lblMonth.Text = DateTime.Now.Month.ToString(); this .lblDay.Text = DateTime.Now.Day.ToString(); this .lblTime.Text = DateTime.Now.ToLongTimeString(); switch (DateTime.Now.DayOfWeek) { case DayOfWeek.Tuesday: this .lblWeek.Text = "二" ; break ; case DayOfWeek.Wednesday: this .lblWeek.Text = "三" ; break ; case DayOfWeek.Thursday: this .lblWeek.Text = "四" ; break ; case DayOfWeek.Monday: this .lblWeek.Text = "一" ; break ; case DayOfWeek.Saturday: this .lblWeek.Text = "六" ; break ; case DayOfWeek.Friday: this .lblWeek.Text = "五" ; break ; case DayOfWeek.Sunday: this .lblWeek.Text = "日" ; break ; } } //学员打卡 private AttendanceService objAttendanceService = new AttendanceService(); private void txtStuCardNo_KeyDown( object sender, KeyEventArgs e) { if ( this .txtStuCardNo.Text.Trim().Length != 0 && e.KeyValue == 13) { //显示学员信息 StudentExt objStu = new StudentService().GetStudentByCardNo( this .txtStuCardNo.Text.Trim()); if (objStu == null ) { MessageBox.Show( "卡号不正确!" , "信息提示" ); this .txtStuCardNo.SelectAll(); return ; } this .lblStuName.Text = objStu.StudentName; this .lblStuClass.Text = objStu.ClassName; this .lblStuId.Text = objStu.StudentId.ToString(); //添加打卡信息 string result = objAttendanceService.AddRecord( this .txtStuCardNo.Text.Trim()); if (result != "success" ) { this .lblInfo.Text = "打卡失败!" ; MessageBox.Show(result, "错误提示" ); } else this .lblInfo.Text = "打卡成功!" ; this .txtStuCardNo.Text = "" ; //等待下一个打卡 this .txtStuCardNo.Focus(); } } |
二,管理员修改密码:
1,后台部分
在DAL--SysAdminService管理数据访问类中添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | namespace DAL { /// <summary> /// 管理员数据访问类 /// </summary> public class SysAdminService { /// <summary> /// 根据登录账号和密码登录 /// </summary> /// <param name="objAdmin">封装了登录账号和密码的管理员对象</param> /// <returns>返回包含管理员信息的对象</returns> public SysAdmin AdminLogin(SysAdmin objAdmin) { //组合SQL语句 string sql = "select AdminName from Admins where LoginId={0} and LoginPwd='{1}'" ; sql = string .Format(sql, objAdmin.LoginId, objAdmin.LoginPwd); //从数据库中查询 SqlDataReader objReader = SQLHelper.GetReader(sql); if (objReader.Read()) { objAdmin.AdminName = objReader[ "AdminName" ].ToString(); } else { objAdmin = null ; //如果登录不成功,则将当前对象清空 } objReader.Close(); //返回结果 return objAdmin; } /// <summary> /// 修改管理员密码 /// </summary> /// <param name="objAdmin"></param> /// <returns></returns> public int ModifyPwd(SysAdmin objAdmin) { string sql = "update Admins set LoginPwd='{0}' where LoginId={1}" ; sql = string .Format(sql, objAdmin.LoginPwd, objAdmin.LoginId); try { return SQLHelper.Update(sql); } catch (SqlException) { throw new Exception( "应用程序和数据库连接出现问题!" ); } catch (Exception ex) { throw ex; } } } } |
2,前端UI:
确认修改的按钮事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | //修改密码 private void btnModify_Click( object sender, EventArgs e) { #region 密码验证 if ( this .txtOldPwd.Text.Trim().Length == 0) { MessageBox.Show( "请输入原密码!" , "提示信息" ); this .txtOldPwd.Focus(); return ; } if ( this .txtOldPwd.Text.Trim() != Program.objCurrentAdmin.LoginPwd) { MessageBox.Show( "请输入的原密码不正确!" , "提示信息" ); this .txtOldPwd.Focus(); this .txtOldPwd.SelectAll(); return ; } if ( this .txtNewPwd.Text.Trim().Length == 0) { MessageBox.Show( "请输入不少于6位的新密码!" , "提示信息" ); this .txtNewPwd.Focus(); return ; } if ( this .txtNewPwd.Text.Trim().Length < 6) { MessageBox.Show( "新密码长度不能少于6位!" , "提示信息" ); this .txtNewPwd.Focus(); return ; } if ( this .txtNewPwdConfirm.Text.Trim().Length == 0) { MessageBox.Show( "请再次输入新密码!" , "提示信息" ); this .txtNewPwdConfirm.Focus(); return ; } if ( this .txtNewPwdConfirm.Text.Trim() != this .txtNewPwd.Text.Trim()) { MessageBox.Show( "两次输入的新密码不一致!" , "提示信息" ); return ; } #endregion //修改密码 try { SysAdmin objAdmin = new SysAdmin() { LoginId = Program.objCurrentAdmin.LoginId, LoginPwd = this .txtNewPwd.Text.Trim() }; if ( new SysAdminService().ModifyPwd(objAdmin) == 1) { MessageBox.Show( "密码修改成功,请妥善保管!" , "成功提示" ); //同时修改当前保存的用户密码 Program.objCurrentAdmin.LoginPwd = this .txtNewPwd.Text.Trim(); this .Close(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构