10.6.4 用户登录的实现
为实现用户密码验证,系统启动时就显示登录界面,让用户输入用户名、密码,并选择权限后,单击【登录】按钮,通过密码验证后方可进入系统。在应用类的初始化函数InitInstance()中添加代码实现上述操作。具体代码如下:
代码位置:见光盘中本章源代码的CLICAIApp类。
- 1 BOOL CLICAIApp::InitInstance()
- 2 {
- 3 bool passflag=false;
//判断登录是否成功 - 4 PWSet mySet;
//定义记录集对象 - 5 mySet.Open();
//打开数据表 - 6 LOGIN mydlg;
//定义对话框对象 - 7 begin:
- 8 mySet.Requery();
//重新打开记录集 - 9 if(mydlg.DoModal()==IDOK)
//按下【登录】按钮 - 10 {
- 11 if(mydlg.m_id==""||mydlg.m_password=="")
//没输入用户名和密码 - 12 {
- 13 AfxMessageBox("用户或密码不能为空");
- 14 return false;
- 15 }
- 16 if(mydlg.author=="管理员")
//选择"管理员"权限 - 17 {
- 18 loginflag=true;
- 19 user="管理员";
- 20 }
- 21 else
//选择"来宾"权限 - 22 {
- 23 loginflag=false;
- 24 user="来宾";
- 25 }
第11~15行代码实现判断是否有数据输入。
第16~25行代码实现了权限组合框选择的判断。
上述代码中Requery()函数实现了记录集的更新,相当于执行Close()和Open()两个操作。读者要注意使用该函数前需确保记录集已经打开了。下面开始遍历记录集,对输入的密码进行验证。对应代码如下:
- 26 while(!mySet.IsEOF())
//记录没到最后一条 - 27 {
- 28 mySet.m_ID.TrimLeft();
//截去字符串左空格 - 29 mySet.m_ID.TrimRight();
//截去字符串右空格 - 30 if(mySet.m_ID==mydlg.m_id&&mySet.m_PASSWORD==mydlg.m_password
- 31 &&mySet.m_AUTHOR==mydlg.author) //输入正确
- 32 {
- 33 mySet.Close();
//关闭记录集 - 34 passflag=true;
//登录成功 - 35 authorflag=true;
- 36 ID=mydlg.m_id;
//保存登录用户名 - 37 COleDateTime oleDt=COleDateTime::GetCurrentTime();
//获取本地的当前时间 - 38 CString strFileName=oleDt.Format("%Y年%m月%d日 %H时%M分%S秒");
- 39 CString strTmp=strFileName+"\r\n\n"+
user+ID+" 登录系统\r\n\n\n\n\n"; - 40 CStdioFile file(logFileName,CFile::
odeNoTruncate|CFile::modeWrite);
//创建文件对象 - 41 file.SeekToEnd();
//先定位到文件尾部 - 42 file.WriteString(strTmp);
//写入到日志文件中 - 43 file.Close();
- 44 break;
- 45 }
- 46 else
- 47 mySet.MoveNext();
- 48 }
- 49 if(!passflag)
//登录不成功 - 50 {
- 51 AfxMessageBox("登录失败,请重试");
- 52 mydlg.m_password="";
- 53 mydlg.m_id="";
- 54 mydlg.m_password="";
- 55 goto begin;
//登录界面再次弹出 - 56 }
- 57 }
- 58 else
- //用户按下【取消】按钮
- 59 return false;
- 60 …
//代码省略 - 61 }
第26~48行代码实现了遍历密码表,判断用户名、密码、权限是否正确。并把操作过程保存在日志文件中。
第49~56行代码实现了输入错误时,登录界面再次显示,让用户重新输入。
第58~59行代码实现了用户按下【取消】按钮时处理。
此处用派生于CFile类的CStdioFile类实现了向文件写入数据。一个CStdioFile对象重载了标准的C流文件,类似用fopen来打开是一样的。文件流被缓冲,既可以以文本格式打开,又可以以二进制模式打开。该类包含于<afx.h>文件中。读文件用ReadString实现读取一行文本。写文件用WriteString实现写入一行文本。其他各个函数的具体使用方法请读者参考MSDN。
权限组合框数据的初始化和选项的获取操作都是在登录对话框类中实现的。给该对话框添加初始化消息函数,给【登录】按钮添加单击按钮消息函数,在头文件中自定义保存权限的字符串变量author。下面分别介绍初始化函数和【登录】按钮消息函数中的具体实现代码。登录界面中初始化函数OnInitDialog()中的代码如下:
代码位置:见光盘中本章源代码的LOGIN类。
- 1 BOOL LOGIN::OnInitDialog()
- 2 {
- 3 CDialog::OnInitDialog();
- 4 MessageBox("说明:管理员账号为hc密码123","家庭理财系统",MB_OK);
- 5 m_combo.InsertString(0,"管理员");
//添加数据项 - 6 m_combo.InsertString(1,"来宾");
//添加数据项 - 7 if(loginflag)
//管理员登录 - 8 {
- 9 m_combo.SetCurSel(0);
//初始显示管理员 - 10 author="管理员";
- 11 }
- 12 else
- 13 {
- 14 m_combo.SetCurSel(1);
//设置初始显示为来宾 - 15 author="来宾";
- 16 }
- 17 return TRUE;
- 18 }
第4行代码实现了默认用户名和密码信息提醒。
第5~6行代码实现了权限组合框数据的填充。
第7~16行代码实现了权限组合框的初始显示设置。
当用户单击【登录】按钮时,要获取组合框中选项内容,保存当前权限到author中。【登录】按钮消息函数具体代码如下:
代码位置:见光盘中本章源代码的LOGIN类。
- 1 void LOGIN::OnOK()
- 2 {
- 3 int i;
- 4 i=m_combo.GetCurSel();
//获取当前选项索引 - 5 m_combo.GetLBText(i,author);
//当前选项对应的内容 - 6 CDialog::OnOK();
- 7 }
第4~5行代码实现了获取当前选项对应的内容,并传给变量author。
上面的代码中组合框类成员函数GetCurSel()返回组合框选中选项的索引号,再通过GetLBText(索引号,字符串)获取对应的字符串。这两个函数读者要熟练掌握。
【责任编辑:
云霞 TEL:(010)68476606】