教学教务管理系统window窗体
1. 总体设计
1.1. 编写目的
某学院教务处教学事务现由手工管理,效率低、易出错、耗费人力。教务处希望设计一个实用的教学事务管理系统,完成学生的学籍管理、报到注册、课程的选择、成绩登入、各种通知单的打印和报表的输出等
1.2. 可行性分析
可利用现有学校资源,结合常用的vs2012、sql 2008等软件即可。软件分成c/s模式。开发人员具有一定经验,可开发一些小软件。
1.3. 性能分析
管理,维护上万条学生记录信息。
能满足近百位学生同时对个人信息的查询。
具有较高的可靠性。安全和保密性高。
1.4. 系统分析
教务管理系统是一个面向学校教务人员,为其提供服务的综合信息管理系统。教务人员通过本系统完成相关的日常工作,这些工作也是平常较为繁重的工作。学生的个人信息、所有的课程考试成绩以及每学期的开课情况都记录在教务系统里进行管理。
1.5. 需求分析
旨在开发一个统一的网上教务信息管理平台,利用信息化手段辅助教学管理,达到提升我校教学管理信息化水平的目的。学生的学籍管理:建立学生学籍档案,对新入学的学生进行登记,将他们的信息记入学籍档案,对毕业、休学、退学的学生进行除名、注销,对调整专业的学生必须做调整记载。对变动情况建立备忘录,对上述情况的变动原因、时间、去向等进行记载。学生学期开学的课程选择,对必修课、限选课直接录入,计算总成绩、平均成绩,并按班级排出名次。统计功能,统计各门课程的及格率,优秀率,各分数档人选。系统可查选学生的学籍情况和选课、学习情况,打印学籍表、个人成绩报告表、班级名词表、各门课程统计表等要求的表格。
2. 总体设计
2.1. 软件模块结构设计
根据系统分析的结果,按照结构化的系统设计方法,教学事务管理系统从功能由
模块名 | 功能简介 |
信息管理 | 录入学生基本信息,如姓名,学号,籍贯,性别,家庭住址,出生年月等基本信息 |
状态管理 | 对其毕业,休学,调整专业等进行备忘处理。 |
成绩管理 | 对选修课必修课成绩的录入,计算成绩,排名等功能 |
2.2.
2.2.1. 登录界面流程处理图
2.2.2. 学生信息管理结构图
2.2.3. 状态信息管理结构图
2.2.4. 课程管理状态图
2.2.5. 成绩管理状态图
3. .接口设计
3.1. 用户接口
在用户界面部分,根据需求分析的结果,用户需要一个用户友善界面。在界面设计上,应做到简单明了,易于操作,并且要注意到界面的布局,应突出的显示重要以及出错信息。其中针对教务管理人员的界面要做到操作简单,易于管理。在设计上采用逐级下拉式菜单方式。同时,运行出错时应以标准形式给出出错提示。
3.2. 外部接口
服务器端程序可DAO(数据访问对象)应用程序编程接口(API),对SQL SERVER数据库进行所有的访问。 服务器程序上可使用SQL SERVER 的对数据库的备分命令,以做到对数据的保存。
3.3. 内部接口
信息管理模块:对其他模块提供对学生信息查询的接口,包括按学号、姓名和班级三种查询方式。
4. 数据库需求分析
通过对学校管理工作过程的内容和数据流图分析,设计如下面的数据项和数据结构。
● 学生档案,包括的数据项有:学生的学号、姓名、性别、出生年月、籍贯、政治面貌、家庭住址、入学时间、学院、专业、年级、班级。
● 课程选择,包括的数据项有:课程编号、课程名称.
● 课程成绩,包括的数据项有:学生编号、学生姓名、课程编号、课程名称、课程成绩。
● 备忘录,包括的数据项有:学生编号、学生姓名、去向、原因、时间,系院、专业、年级、班级。
● 学生的成绩情况,包括的数据项有:学生编号、学生姓名、总成绩、平均成绩、班级。
● 数据库概念结构设计
根据上面设计规划出的实体,我们对各个实体具体的描述E-R图如下:
课程选择e-r
学生信息e—r
课程成绩e-r
备忘录e-r
学生成绩情况e-r
4.1. 数据库逻辑结构设计
STUDENT_INFO(学生信息表) | ||||
字段名 | 数据类型 | 长度 | 说明 | 描述 |
ID | nchar | 10 | 不空,主键 | 学生编号 |
NAME | nvarchar | 20 | 不空 | 学生姓名 |
SEX | nchar | 10 | 不空‘男’、‘女’ | 性别 |
BIRTHDAY | datetime | 不空 | 出生年月 | |
JG | nvarchar | 50 | 不空 | 籍贯 |
ZZMM | nvarchar | 50 | 不空 | 政治面貌 |
JTZZ | nvarchar | 50 | 不空 | 家庭住址 |
RXDATE | datetime | 不空 | 入学日期 | |
XY | nvarchar | 20 | 不空 | 系院 |
ZY | nvarchar | 20 | 不空 | 专业 |
NJ | nvarchar | 20 | 不空 | 年纪 |
CLASS | nvarchar | 20 | 不空 | 班级 |
ZT | nvarchar | 20 | 不空 | 状态 |
CS_INFO(课程成绩信息) | ||||
字段名 | 数据类型 | 长度 | 说明 | 描述 |
CS_STUD_ID | nchar | 10 | 不空,主键 | 学生编号 |
CS_STUD_NAME | nvarchar | 20 | 不空 | 学生姓名 |
CS_COU_ID | nchar | 10 | 不空,主键 | 课程编号 |
CS_COU_NAME | nvarchar | 30 | 不空 | 课程名称 |
CS_GRADE | int | 不空 | 成绩 | |
SC(课程信息表) | ||||
字段名 | 数据类型 | 长度 | 说明 | 描述 |
C_ID | nchar | 10 | 不空,主键 | 课程编号 |
C_NAME | nvarchar | 30 | 不空 | 课程名称 |
BWL_INFO(备忘录) | ||||
字段名 | 数据类型 | 长度 | 说明 | 描述 |
STU_ID | nchar | 10 | 不空,主键 | 学生编号 |
STU_NAME | nvarchar | 20 | 不空 | 学生姓名 |
BWL | nvarchar | 50 | 不空 | 去向 |
REASON | nvarchar | 50 | 不空 | 原因 |
TIME | datetime | 不空 | 时间 | |
XY | nvarchar | 20 | 不空 | 去的系院 |
ZY | nvarchar | 20 | 不空 | 去的专业 |
NJ | nvarchar | 20 | 不空 | 年级 |
CLASS | nvarchar | 20 | 不空 | 班级 |
RECORD(学生成绩情况信息) | ||||
字段名 | 数据类型 | 长度 | 说明 | 描述 |
RE_STUD_ID | nchar | 10 | 不空,外键 | 学生编号 |
RE_STUD_NAME | nvarchar | 20 | 不空 | 学生姓名 |
RE_ALL | int | 不空 | 总成绩 | |
RE_AVG | int | 不空 | 平均成绩 | |
RE_BANJI | nvarchar | 20 | 不空 | 班级 |
5.程序设计
5.1登录界面
该界面为登录窗口,需要正确的账号及密码才能正确登录,如图一
图一 登录界面
主要代码设计如下:
private void button1_Click(object sender, EventArgs e)
{string connString=@"DataSource=(LocalDB)\v11.0;
AttachDbFilename=|DataDirectory|\Student.mdf;Integrated Security=True;Connect Timeout=30";
SqlConnection conn=new SqlConnection(connString);
conn.Open();
string sql="select * From UserInfo where UserName='"+txtUserName.Text.Trim()+"'and UserPwd='"+txtUserPwd.Text.Trim()+"' ";
SqlCommand cmd=new SqlCommand(sql,conn);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{ Username = dr["UserName"].ToString();
frmMain frm = new frmMain();
frm.Show();
this.Hide(); }
else {
MessageBox.Show("账号或密码错误!请重新输入!", "出错了",MessageBoxButtons.OK, MessageBoxIcon.Error); }
dr.Close();
conn.Close();
}
5.2程序主界面
该界面为各种功能提供了集合的面板,所有程序功能均能在该界面找到相应入口,包括
修改用户登录密码、管理学生信息、管理课程信息和管理学生成绩,如图二:
图二
5.3学生信息管理
5.3.1 添加学生信息
该界面提供录入学生信息到数据库当中,如图三
图三
主要代码设计:
private void button1_Click(object sender, EventArgs e)
{ if (txtID.Text.Trim().Length != 0&&txtName.Text!=""&&comboBox1.SelectedValue!="")
{ string studentSex = "";
if (optMale.Checked)
{
studentSex = "男";
}
if (optFemale.Checked)
{
studentSex = "女";
}
string sql = "insert into studentinfo(StudentId,StudentName,StudentSex,StudentNativePlace,StudentBirthday,studentclass) Values('"
+ txtID.Text + "',N'" + txtName.Text + "',N'" + studentSex + "',N'" + cbNativePlace.SelectedItem + "','" + dateTimePicker1.Value + "',N'"+comboBox1.SelectedValue+"')";
try
{
if (OperateDB.ExecuteNonQuery(sql) == 1)
{
MessageBox.Show("添加成功"); }
else
{
MessageBox.Show("添加失败"); } }
catch(Exception err)
{
MessageBox.Show("数据库读取出错"); }
}
else {
MessageBox.Show("填写完整信息");
} }
5.3.2查询界面
该界面提供查询某学生学籍信息和个人成绩功能,如图四和图五
图四
图五
查询学生信息窗体主要代码如下:
private void button1_Click(object sender, EventArgs e)
{ string sql = "select studentclass as 班级, StudentId as 学号,StudentName as 名字 ,StudentSex as 性别,StudentNativePlace as 籍贯 from StudentInfo where StudentName like N'%"+txtName.Text.Trim()+"%'";
DataSet ds = OperateDB.ExecuteDataSet(sql);
dataGridView1.DataSource = ds.Tables[0].DefaultView; }
查询个人成绩窗体主要代码如下:
private void button1_Click(object sender, EventArgs e)
{ if (textBox1.Text == "")
{
MessageBox.Show("请输入正确信息"); }
else
{ string sql = "select grade_info.Cou_name as 科目 ,grade_info.Grade as 成绩 ,course_info.count as 学分 from course_info join grade_info on course_info.cou_name=grade_info.cou_name where stud_name=N'" + textBox1.Text + "' ";
DataSet ds = OperateDB.ExecuteDataSet(sql);
dataGridView1.DataSource = ds.Tables[0].DefaultView;
}
}
5.4课程管理
5.4.1添加课程
为每个班级添加本学期课程内容,如图六
图六
主要代码如下:
private void button1_Click(object sender, EventArgs e)
{ if (textBox1.Text != "" && textBox2.Text != "" && textBox3.Text != "" && textBox4.Text != "" && comboBox1.SelectedValue != "")
{ string sql = "insert into course_info values('" + textBox1.Text + "',N'" + textBox2.Text + "',N'" + textBox3.Text + "','" + textBox4.Text + "')";
string sql2 = "insert into class values(N'" + comboBox1.SelectedValue + "','" + textBox1.Text + "',N'" + textBox2.Text + "')";
OperateDB.ExecuteNonQuery(sql2);
try {if (OperateDB.ExecuteNonQuery(sql) == 1)
{ MessageBox.Show("添加成功");
}
else
{ MessageBox.Show("添加失败");
}
}
catch (Exception err)
{
MessageBox.Show("数据库读取失败");
}
}
else
{
MessageBox.Show("填写完整信息");
}
}
5.4..2查询及修改课程信息
该窗体为查询课程的详细信息及修改某些课程属性,如图七
图七
主要代码如下:
private void button1_Click(object sender, EventArgs e)
{string sql;
Regex rx = new Regex("^[\u4E00-\u9FA5]+$");
if (rx.IsMatch(textBox1.Text))
{
sql = "select * from course_info where cou_name like N'%" + textBox1.Text + "%' or teacher like N'%"+textBox1.Text+"%'";
}
else { sql = "select * from course_info where cou_id like '%"+textBox1.Text+"%'";
}
DataSet ds = OperateDB.ExecuteDataSet(sql);
dataGridView1.DataSource = ds.Tables[0].DefaultView;
}
5.5成绩管理
5.5.1添加学生成绩
该界面可以录入学生本学期所有成绩,如图八
图八
主要代码设计如下:
private void textBox1_Leave(object sender, EventArgs e)
{ string sql = "select Studentid from studentinfo where studentname=N'"+textBox1.Text+"' ";
DataSet ds = OperateDB.ExecuteDataSet(sql);
textBox2.Text=ds.Tables[0].Rows[0][0].ToString(); }
private void comboBox1_Leave(object sender, EventArgs e)
{ string sql = "select cou_id from course_info where cou_name=N'" + comboBox1.SelectedText + "' ";
DataSet ds = OperateDB.ExecuteDataSet(sql);
textBox4.Text = ds.Tables[0].Rows[0][0].ToString();
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text != "" && comboBox1.SelectedValue != "" )
{
if (textBox3.Text != "")
{
string sql = "insert into grade_info values('" + textBox2.Text + "','" + textBox4.Text + "',N'" + textBox1.Text + "','" + textBox3.Text + "',N'" + comboBox1.SelectedValue + "')";
try {
if (OperateDB.ExecuteNonQuery(sql) == 1)
{
MessageBox.Show("添加成功");
}
else {
MessageBox.Show("添加失败");
}
}
catch (Exception err) {
MessageBox.Show(err.ToString());
}
}
else{
MessageBox.Show("请输入成绩"); } }
else
{
MessageBox.Show("请输入姓名或科目"); } }
private void button2_Click(object sender, EventArgs e)
{ textBox1.Text = "";
textBox2.Text = "";
textBox3.Text = "";
textBox4.Text = ""; }
private void gradeAdd_Load_1(object sender, EventArgs e)
{ this.course_infoTableAdapter.Fill(this.studentDataSet6.course_info); }
}
5.5.2统计班级信息
该界面可以统计某班级某分数段某学科成绩,并显示该分数段人数,同时显示该班级该科的及格率和优秀率,如图九
图九
主要代码如下:
private void frmtongj_Load(object sender, EventArgs e)
{ this.studentinfoTableAdapter.Fill(this.studentDataSet1.studentinfo); }
private void button1_Click(object sender, EventArgs e)
{ int a=0, b=0;//设置查询数据区间
if(comboBox2.SelectedItem=="及格")
{ a = 60; b = 100; }
else if(comboBox2.SelectedItem=="不及格")
{ a = 0; b = 59; }
else if (comboBox2.SelectedItem == "60~69")
{ a = 60; b = 69; }
else if (comboBox2.SelectedItem == "70~79")
{ a = 70; b = 79; }
else if (comboBox2.SelectedItem == "80~100")
{ a = 80; b = 100; }
else if (comboBox2.SelectedItem == "全部")
{ a = 0; b = 100; }
float m, n;//定义及格人数和优秀人数
string sql = "select stud_id as 学号,stud_name as 姓名,grade as 成绩 from grade_info where stud_id IN (select studentid from studentinfo where studentclass=N'" + comboBox1.Text + "' ) and cou_name =N'" + comboBox3.Text + "'and grade>='" + a + "' and grade<='" + b + "' ";
DataSet ds = OperateDB.ExecuteDataSet(sql);
dataGridView1.DataSource = ds.Tables[0].DefaultView;
textBox1.Text = Convert.ToString( ds.Tables[0].Rows.Count);
string sql4 = "select stud_id from grade_info where stud_id IN (select studentid from studentinfo where studentclass=N'" + comboBox1.Text + "' ) and cou_name =N'" + comboBox3.Text + "'";
DataSet ds4 = OperateDB.ExecuteDataSet(sql4);//统计该班级总人数
string sql2 = "select stud_id from grade_info where stud_id IN (select studentid from studentinfo where studentclass=N'" + comboBox1.Text + "' ) and cou_name =N'" + comboBox3.Text + "'and grade>=60 ";
DataSet ds2 = OperateDB.ExecuteDataSet(sql2);//统计该科几个认识
m =(float) ds2.Tables[0].Rows.Count / (float)ds4.Tables[0].Rows.Count;//计算出及格率
textBox2.Text = Convert.ToString(m);
string sql3 = "select stud_id from grade_info where stud_id IN (select studentid from studentinfo where studentclass=N'" + comboBox1.Text + "' ) and cou_name =N'" + comboBox3.Text + "'and grade>=90 ";
DataSet ds3 = OperateDB.ExecuteDataSet(sql3);//统计分数大于90的人数
n = (float)ds3.Tables[0].Rows.Count / (float)ds4.Tables[0].Rows.Count;//计算出优秀率
textBox3.Text = Convert.ToString(n); }
private void comboBox1_Leave(object sender, EventArgs e)
{ this.classTableAdapter.Fill(this.studentDataSet3._class); }
5. 系统出错处理设计
5.1. 系统的出错信息以及处理方法
系统的出错信息以及处理方法一览表:
出错名称 | 系统输出信息 | 处理方法 |
用户名输入错误 | “用户名错!请重新输入!” | 进入登录页面 |
前三次密码错误 | “您的密码输入有误,请重新输入!” | 进入登录页面 |
密码错数次数超过三次 | “密码错误!请半个小时后再进行登录操作!” | 进入默认登录页,并半小时内禁止该用户进行登录。 |
输入数据格式错误 | “输入格式不正确,请检查后再输入!” | 返回原输入页面 |
不允许为空的输入框输入空字符 | “请输入!” | 弹回原输入页面的输入处 |
选择打印成绩,但未找到可用打印机设备 | “未检测到可用打印设备,无法进行打印!” | 停止打印操作 |
系统故障 | “服务器维护中!暂停服务!” | 立即启用备用机,恢复故障 |
5.2. 补救措施
由于数据在数据库中已经有备份,故在系统出错后可以依靠数据库的恢复功能,并且依靠日志文件使系统再启动,就算系统崩溃用户数据也不会丢失或遭到破坏。但有可能占用更多的数据存储空间,权衡措施由用户来决定。
6. 项目设计总结
本次项目设计通过设计一个具体的程序的设计过程,了解到了真实的程序是怎样实现功能,与错误处理。通过对数据库的调用可以更好的学习到数据如何工作与分配的,也加深了对数据库的使用和维护。
也了解到了自己的诸多不足,比如流程图的设计,需要一个比较完善的设计,考虑到需求分析,尽量做到所有功能均能实现,同时完善细微但是却很有必要的功能。对于整个程序的设计要有一个大致方向,跟着流程图来编写程序的运行顺序。并且在有错误的地方要有人性化的提示语句,提示用户哪里错误了,这样程序运行起来才会很流畅,给人更好的使用体验。
在窗口程序设计阶段,最困难的是combobox DataSource的设置,最后使用绑定数据的方法解决,同时可以在数据源里面设置select语句来修改查询的内容
7. 参考文献
[1]唐政,房大伟.c#项目开发全程实录.清华大学出版社,2008.6.1
项目设计 评 语 | |||
项目设计 成 绩 | 指导教师 (签字) | 年 月 日 | |
¥29.8
¥9.9
¥59.8