【14周数据库大实验进度】C# Visual Studio选课系统之管理员界面部分实现

选课系统大致按身份分为三个界面——学生界面,老师界面,管理员界面。这周实现了管理员界面的部分和登录界面加验证码,注册界面等等。

登录界面新增

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,最主要的操作算法已经掌握。
每周一励志:
加油!我很棒!我的大实验很棒!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值