选课系统大致按身份分为三个界面——学生界面,老师界面,管理员界面。这周实现了管理员界面的部分和登录界面加验证码,注册界面等等。
登录界面新增
1.加验证码(随机数Random实现)
另外还添加了身份的选择,是为了通过这个区别之后进入的界面。
加验证码的代码实现:
private void Formlogin_Load(object sender, EventArgs e)
{
Random ran = new Random();
int number;
char code1;
//取五个数
for (int i = 0; i < 5; i++)
{
number = ran.Next();//取非负随机数
if (number % 2 == 0)
code1 = (char)('0' + (char)(number % 10));//两个char类型运算会自动转换为int类型的运算
else
code1 = (char)('A' + (char)(number % 26)); //转化为字符
this.code += code1.ToString();
}
label5.Text = code;
}
在窗口的Load事件中,通过正则表达式添加验证码显示。缺点是,还不能切换。(这里验证码一般是数字0,没有字母O)
用到随机数Random的next(),表示返回非负的随机数。
常用操作如下:
该图片截自
https://www.cnblogs.com/springsnow/p/11081320.html
2.密码MD5加密
public static string EncryptWithMD5(string source)
{
//MD5加密,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位
//向strbul字符串后追加
}
return strbul.ToString();
}
3.登录后,记录到Syslog表中
sql = "insert into SysLog values ( '" + username + "' , '" + DateTime.Now + "' , '" + "Login" + "')"; //编写SQL命令
sqlCommand = new SqlCommand(sql, sqlConnection);//记录日志(登录部分)
sqlCommand.ExecuteNonQuery();
4.链接标签——注册
链接标签的LinkClicked事件
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
FormRegister formregister = new FormRegister();
formregister.ShowDialog();
}
Show和ShowDialog的区别:
(主要区别,还有其他别的区别)
1.在调用Form.Show方法后,Show方法后面的代码会立即执行
2.在调用Form.ShowDialog方法后,直到关闭对话框后,才执行此方法后面的代码
ShowDialog是以对话框的形式显示,不关闭该对话框,不能操作其他窗体。
5.对于登陆失败分了情况给出提示
用了if…else…语句和MessageBox实现。(比较简单,代码省略)
注册界面
1.输入UserID必须满足要求才可离开
正则表达式和Leave事件
public Byte[] mybyte = new byte[0];
private void textBox_userid_Leave(object sender, EventArgs e)
{
if (textBox_userid.Text.Trim() != "")
{
//使用regex(正则表达式)进行格式设置 至少有数字、大写字母、小写字母各一个。最少3个字符、最长20个字符。
Regex regex = new Regex(@"(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{3,20}");
if (regex.IsMatch(textBox_userid.Text))//判断格式是否符合要求
{
//MessageBox.Show("输入密码格式正确!");
}
else
{
MessageBox.Show("至少有数字、大写字母、小写字母各一个。最少3个字符、最长20个字符!","Tips",MessageBoxButtons.OK,MessageBoxIcon.Warning);
textBox_userid.Focus();//设置输入焦点
}
}
else
{
MessageBox.Show("请填写完整信息!","Tips",MessageBoxButtons.OK,MessageBoxIcon.Warning);//不能为空
}
}
2.SqlParameter传参省去拼接SQL字符串
private void buttonOK_Click(object sender, EventArgs e)
{
try
{
string connString = "Data Source=.;Initial Catalog=school;Persist Security Info=True;User ID=sa;Password=fucong916626";//数据库连接字符串
SqlConnection connection = new SqlConnection(connString);//创建connection对象
string sql = "insert into SysUser (UserID, UserPassWord , UserSchoolID, UserMobile, UserBirthday , UserIdentity , UserPhoto ) " +
"values (@userid, @userpassword,@userschoolid,@usermobile,@userbirthday,@useridentity,@userphoto)";
SqlCommand command = new SqlCommand(sql, connection);
SqlParameter sqlParameter = new SqlParameter("@userid", textBox_userid.Text);
command.Parameters.Add(sqlParameter);
sqlParameter = new SqlParameter("@userpassword", EncryptWithMD5(textBox_password.Text));//加密后再保存
command.Parameters.Add(sqlParameter);
sqlParameter = new SqlParameter("@userschoolid", textBox_schoolid.Text);
command.Parameters.Add(sqlParameter);
sqlParameter = new SqlParameter("@usermobile", textBox_mobile.Text);
command.Parameters.Add(sqlParameter);
sqlParameter = new SqlParameter("@userbirthday", dateTimePicker1.Value);
command.Parameters.Add(sqlParameter);
sqlParameter = new SqlParameter("@useridentity", comboBox_identity.Text);
command.Parameters.Add(sqlParameter);
sqlParameter = new SqlParameter("@userphoto", SqlDbType.VarBinary, mybyte.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, mybyte);
command.Parameters.Add(sqlParameter);
//打开数据库连接
connection.Open();
command.ExecuteNonQuery();
connection.Close();
MessageBox.Show("注册成功!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
this.Close();//关闭该窗口
}
在该程序的SqlParameter的用法:
sqlParameter = new SqlParameter(“参数(要加@)”, 传给参数的值);
SqlCommand对象.Parameters.Add(SqlParameter对象)
在网上发现了SqlParameter几种用法的总结:
http://www.360doc.com/content/18/0915/07/13941078_786793852.shtml
(感觉还不错,可以学习一下)
3.上传图片的实现
private void button_upload_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.ShowDialog();//打开浏览图片对话框
string picturePath = openFileDialog.FileName;//获取图片路径
//文件的名称,每次必须更换图片的名称,这里很为不便
//创建FileStream对象
FileStream fs = new FileStream(picturePath, FileMode.Open, FileAccess.Read);
//声明Byte数组
mybyte = new byte[fs.Length];
//读取数据
fs.Read(mybyte, 0, mybyte.Length);//offset -- 偏移量开始存储字符的位置,mybyte为缓冲区
DialogResult result = MessageBox.Show("一旦上传,照片将不能更改,确定上传么?", "Tips", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);//取出按钮结果
if (result == DialogResult.OK)
{
pictureBox1.Image = Image.FromStream(fs);//从fs数据流创建图像
}
fs.Close();
}
打开图片浏览框选择图片上传后,会提示消息。(因为我比较懒,所以想在之后个人信息框中省去改图片的操作,就让他们注册时就不能修改了。。)
点击OK后注册成功:
管理员界面
(下面只列出完成了的部分界面和功能)
1.学生信息管理
(基本没有怎么改动,详情请看上一篇博客)
2.课程信息管理
基本功能也就是增删改查(省去演示,跟上篇博客的增删改查基本相同)
3.选课信息管理
注:SC表中的删除,就不能只以第一列的值删了,因为主码是(Sno,Cno),要同时取出选中行的第一列和第二列的值。
string select_sno = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
string select_cno = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
string delete_by_cno = "delete from SC where Cno=" + "'" + select_cno + "' AND Sno = " + "'" + select_sno + "'";
这里相关的一个链接,感觉很有用(这次搬链接搬得好多。。)
C# DataGridView如何获取选中行的某个数据
4.后台信息浏览
也就是查看所有表数据,是老师周一讲的一个界面
显示图片按钮点击事件:
private void button1_Click(object sender, EventArgs e)
{
try
{
string connString = "Data Source=.;Initial Catalog=school;Persist Security Info=True;User ID=sa;Password=";//数据库连接字符串
SqlConnection connection = new SqlConnection(connString);//创建connection对象
//打开数据库连接
connection.Open();
//创建SQL语句
string sql = "select UserPhoto from SysUser where UserID = '" + textBox1.Text + "'";
//创建SqlCommand对象
SqlCommand command = new SqlCommand(sql, connection);
//创建DataAdapter对象
SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
//创建DataSet对象
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet, "SysUser");
int c = dataSet.Tables["SysUser"].Rows.Count;
if (c > 0)
{
Byte[] mybyte = new byte[0];
mybyte = (Byte[])(dataSet.Tables["SysUser"].Rows[c - 1]["UserPhoto"]);
MemoryStream ms = new MemoryStream(mybyte);
pictureBox1.Image = Image.FromStream(ms);
}
else
pictureBox1.Image = null;
connection.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}//加载图片
5.退出登录
因为感觉8个按钮和标签在一起,会有些丑,就把退出登录的操作放到了窗口关闭的地方。
点确定会调到最开始的登录界面,表示退出了当前用户。
点取消,停留在原本的界面。
(感觉放在这里也有些不妥,等以后可以改一下界面的格局。)
教师信息管理,用户信息管理,个人信息部分还没有做完。
数据库中新增表和触发器
【心得】看有的同学都做完提交了,内心还是有些着急。
不足:
目前完成度较低,触发器,存储过程部分需要努力,对于增删改查,几个表,几个界面太过相似,需要创新改进一下。
优势:
增删改查CRUD,最主要的操作算法已经掌握。
每周一励志:
加油!我很棒!我的大实验很棒!