概述
最近正在做一个小型的餐饮管理系统,其中老师要求我们实现记住密码功能,前一段时间已经完成,今天做一下笔记。
首先我们进行需求分析:
用户点击记住密码功能后应该用本地存储的形式,生成文件。在此借鉴了QQ的登录设计。
我们在使用QQ时可以发现无论用户是否点击记住密码只要在某一台计算机上登录都会把账号记录下来并以下拉框的形式展现。
所以采用这种思想(当然安全性和实用性并不高,只是实现这种思想):用户在登录后在文件中记住一串字符串(用户名:密码 - 是否自动登录)在登录后写入文件这三部分内容文件名使用用户名
初始时例如(bixc:%%-0)
如果选择了记住密码就重新生成一次文件把上次的文件覆盖掉内容为(bixc:***-0)
如果选择自动登录也重新生成一次文件(bixc:***-1)
生成文件
//记住密码
if (cbRemPass.Focused) //只有在获得焦点时才触发(人为操作时会触发)
{
string path = "../../file/";
string value = comName.Text + ":";
//如果为选中状态
if (cbRemPass.CheckState == CheckState.Checked)
{
if (comName.Text == "" || txtPass.Text == "")
{
MessageBox.Show("请输入用户名或密码", "提示");
cbRemPass.Checked = false;
}
else
{
user.saveTotxt(path + comName.Text, value + txtPass.Text + "-0");
}
}
//否则就是不选中,密码用%%
else
{
if (comName.Text != "" || txtPass.Text != "")
user.saveTotxt(path + comName.Text, value + "%%-0");
}
}
//自动登录
if (cbAutoLogin.Focused)
{
string path = "../../file/";
string value = comName.Text + ":";
if (cbAutoLogin.CheckState == CheckState.Checked)
{
if (comName.Text == "" || txtPass.Text == "")
{
MessageBox.Show("请输入用户名或密码", "提示");
cbAutoLogin.Checked = false;
}
else
{
user.saveTotxt(path + comName.Text, value + txtPass.Text + "-1");
cbRemPass.Checked = true;
cbRemPass.Enabled = false;
}
}
else
{
if (comName.Text != "" || txtPass.Text != "")
{
user.saveTotxt(path + comName.Text, value + txtPass.Text + "-0");
cbRemPass.Enabled = true;
}
}
}
之所以加上第一个if判断是因为当我们在选择自动登录时一定是要记住密码的但由于我们是一次行写入文件的(bixc:***-1)所以写一次就够了而在此时需要设置记住密码为已选择状态,但我们还不想触发里边的内容(因为这是选择改变事件)就设置了if (cbAutoLogin.Focused)意思是只有在获取焦点的时候触发,也就是用户点击时。这里的1用来表示用户自动登录,此处作为标志。
这里的 user.saveTotxt(path, value);是用用户类(User)封装的一个函数path指的是存储路径,当然这里就是"…/…/file/"+ comName.Text其实应该在用户安装完程序后创立file文件夹,value指的是存储内容代码如下
public void saveTotxt(string path,string value)
{ //这里的FileMode要选择创建
FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write);
StreamWriter writer = new StreamWriter(file);
writer.WriteLine(value);
writer.Close();
file.Close();
}
以上是用户点击时生成文件下面介绍窗体加载后的处理
实现登录
这里有一个小bug也就是file文件夹不能存放别的东西,只能由系统生成文件
这里是窗体加载时的代码
string path = "../../file/";
user.Name = "";
int i = 0;
//遍历文件夹的内容通过使用文件夹名来当作用户名
foreach (FileInfo file in new DirectoryInfo(path).GetFiles())
{
user.Name = file.Name;
string strus = User.readFile(path + file.Name);
//以“:”和“-”分割字符串是数组填入用户名,密码,是否自动登录(用1来判断)
string[] values = strus.Split(new char[2] { ':', '-' });
//想二维数组(users)中每次添加一条记录(一个用户的登录信息)
//因为可能有很多的用户从某台计算机登录
users.Add(values.ToList());
comName.Items.Add(users[i][0]);
i++;
}
在窗体加载后展现窗体
通过不同的标识来识别用户的登录信息状态
if(File.Exists("../../file/" + user.Name))
{
comName.Text = users[0][0];
if (users[0][1] != "%%")
{
txtPass.Text = users[0][1];
cbRemPass.Checked = true;
}
if (users[0][2] != "0")
{
cbAutoLogin.Checked = true;
user.IsAuto = true;
btnLogin.PerformClick();//触发登录按钮
this.Refresh();
}
}
这里是把第一个用户的信息添加到文本框
剩下的内容就是在切换下拉框时也是如同这样进行判断并修改选项由于很简单就不演示了
这中想法还有一个不合理的地方就是无法记住上次登录的用户,而在QQ中我们可以看到即是有多个用户当一个用户选择自动登录后以后也就不需要处理就可以登录上去,而如果有多个用户的话只有第一个用户且选择自动登录的可以登录上去其他用户即是选择了自动登录也没有办法被实现,我想的是用时间的先后顺序排序一下,很明显失败了,不过以后会解决的。
附图片: