时隔好久,我又回来报告进度了。最近时间依旧紧张,所以进度有限,等到这周过去,大部分课就会结课了,数学模型的大作业也应该做完了,那时进度应该会快起来了吧……
先来接续上一篇博客的内容,关于分窗操作的办法,我确实想到了,利用线程锁将当前进程锁定,应该就可以解决不少问题,不过在实际写代码中遇到了一点问题,目前正在修改,这次暂时不贴出来了。
另一方面,登录的优化和注册的实现终于有了进展,就和大家汇报一下吧。
登录优化
优化后的界面
密码使用了MD5加密来确保安全性
需要新建一个MD5加密函数
public static string EncryptWithMD5(string source)
{
byte[] sor = Encoding.UTF8.GetBytes(source);
MD5 md5 = MD5.Create();
byte[] result = md5.ComputeHash(sor);
StringBuilder strbul = new StringBuilder(40);
for (int i = 0; i < result.Length; i++)
{
strbul.Append(result[i].ToString("x2"));//加密结果"x2"结果为32位,"x3"结果为48位,"x4"结果为64位
}
return strbul.ToString();
}
然后修改登录时的密码验证
string password = EncryptWithMD5(textBoxPassWord.Text.Trim());
没错,只是一句简单的修改就完成了,并不复杂
验证码
本次的重头戏之一,为了实现一个还算能用的验证码,可是花了我不少心思
注意:我的验证码采用了文本框格式,也因此有不少缺陷,比如字符都挤在一起,没有干扰用的黑点与斜线,验证码的排列方向只能水平等等。但是如果利用图片格式需要很多复杂的绘图指令和复合操作,我还没能完全吃透,如果日后有时间的话,我会回来修改的……
首先新建一个文本框,格式设计为不启用(防止选中然后复制),初始背景色选一个喜欢的就好,建议为浅色,防止验证码不明显。
记住,一定不要给文本框初始值来做验证码
这样第一个验证码就是固定的,设置验证码也就失去了意义。第一个验证码必须和刷新后的验证码一样,都是随机生成的。
为此我们需要在登录窗口类中新建一些变量:
private string Scode;//存放验证码
private static char[] constant =
{
'0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
};//验证码单个字符的可能取值
接下来是生成验证码的函数
public void Randomcode()
{
int i = 0;
Scode = "";
Random rand = new Random();
for (i = 0; i < 4; i++)
{
Scode += constant[rand.Next(0, 57)];
}
textBox1.BackColor = Color.FromArgb(rand.Next(200,225), rand.Next(200, 225), rand.Next(200, 225));
textBox1.ForeColor = Color.FromArgb(rand.Next(0,100), rand.Next(0, 100), rand.Next(0, 100));
textBox1.Text = Scode;
i = rand.Next(1, 3);
if(i==1)
{
textBox1.TextAlign = HorizontalAlignment.Center;
}
if (i == 2)
{
textBox1.TextAlign = HorizontalAlignment.Left;
}
if (i == 3)
{
textBox1.TextAlign = HorizontalAlignment.Right;
}
}
原理很简单,从预设的取值类当中随机取出四个即可。但是注意事项却有不少。
首先,文本框的背景颜色与验证码的字体颜色应该是随机的,但是完全随机又会让验证码难以识别(比如黑色的背景,黑色的字),背景颜色应该尽可能浅,验证码则尽可能深,在查阅了相关资料后,我进行了代码中的范围限制。
还有,我使用了一种简陋的办法,即改变文本对齐方式,来实现验证码的移动,只不过效果不是很明显就是了。
验证码函数制作完成后,一定要记住在必要的时候进行调用:
登录窗口创建的时候
public Login()
{
InitializeComponent();
this.Randomcode()