洛阳理工学院课程设计报告课程名称数据库课程设计设计题目教务管理系统专业计算机科学与技术班级B120505学号姓名完成日期2015-1-4课程设计任务书设计题目:教务管理系统设计内容与要求:设计教务管理系统,类似于我校教务管理系统,有四类用户:教务员、学生、教师、管理员教务员可以输入学生、教师、班级、课程信息。
一个班级只属于一个专业,一个学生只属于一个班级。
教务员负责输入每个专业、每个班级需要学习哪些课程,指定课程的任课教师。
教师可以查看学习该课程的学生名单。
课程结束后,教师可以录入课程成绩。
一个教师可以教授多个班的多门课程,每门课由多位老师讲授。
课程分两类,必修课和选修课。
系统要记录每个学生学习各门必修课的成绩,还要记录学生选修了哪些选修课以及课程成绩。
学生可以查看自己各门课程的成绩。
学生还可以进行评教,给老师打分。
管理员可以输入教室信息,并结合班级、课程、教室信息实现自动排课。
要求:1.完成本系统的需求分析,写出功能需求和数据需求描述;2.完成数据库的概念结构设计、逻辑结构设计、物理结构设计;3.完成本系统的部分功能模块的程序界面设计。
指导教师:高春玲2014 年12 月28 日课程设计评语成绩:指导教师:_______________年月日目录一、概述 21.1、本设计的目的与意义 21.2、数据库开发工具和应用程序开发工具 2二、需求分析 22.1功能需求 22.2数据需求 2三、概念结构设计 23.1、E-R模型设计 23.2、总体E-R图描述 4四、逻辑结构设计 44.1、关系模型 44.2、关系模式的优化与说明 4五、物理结构设计 55.1建立数据库 55.2表与表结构 5六、应用程序设计 66.1、系统总体结构 6 6.2、系统界面与源代码7 6.2.1、界面7 6.2.2、功能描述96.2.3、程序源代码9七、设计总结23八、体会与收获24九、参考文献24一、概述本系统后台数据库采用Microsoft SQL Server 数据库,该数据库系统在安全性、准确性和运行速度方面有绝对的优势,并且处理数据量大,效率高;前台采用Microsoft 公司的Visual Studio 2010作为主要开发工具,可与SQL Server 2008数据库无缝链接。
二、需求分析2.1、功能需求本系统的功能如下:1)学生信息查询:学生可以根据学号、姓名、专业进行查询.2)学生信息管理:主要是用于学生信息更新、插入、删除;3)学生成绩录入:用于学生成绩管理,录入学生成绩,也可以更新;2.2、数据需求本系统需要的数据如下:学生:学号、姓名、性别、年龄教师:工号、姓名、性别、年龄班级:班号、班名、人数、课程:课程号、课程名、上课时间、上课地点专业:专业号、专业名三、概念结构设计3.1、E-R模型设计(E-R图)学生和教师实体及其属性E-R图教师与课程E-R图部分实体的E-R图总体E-R图3.2、总体E-R图描述学生与班级之间的联系是所属关系(一对多关系)班级与专业之间的联系是所属关系(一对多关系)班级与课程之间的联系是学习关系(多对多关系)学生选修一门选修课(一对多关系)学生评教老师所教课程(多对多关系)老师教授课程(多对多关系)四、逻辑结构设计4.1、关系模型学生(学号、姓名、性别、年龄、班号、选修课程号、分数)教师(工号、姓名、性别、年龄)班级(班号、班名、人数、专业名)课程(课程号、课程名)成绩(必修课程号、班号、学号、分数)评教(学号、工号、课程号、评分)教授(工号、课程号)课程表(课程号、工号、上课时间、上课地点)(实现排课功能)用户(用户名、密码、用户类型)(存储登陆查询系统的人员信息)加粗表示外键、加下划线表示主码4.2、关系模式的优化与说明例如:教授关系的依赖关系如下:(工号、课程号)—〉工号、课程号所以教授关系模式属于第三范式教师关系的依赖关系如下:工号—>工号、姓名、性别、年龄因为没有非主属性对码的部分函数依赖,也没有非主属性对码的传递函数依赖所以教师关系模式属于第三范式五、物理结构设计5.1、数据库的建立5.2、表与表结构班级(Class)表的结构课程(Course)表的结构学生(Student)表的结构教师(Teacher)表的结构评教(Judge)表的结构教授(Teach)表的结构成绩(Grade)表的结构六、应用程序设计6.1、系统总体结构1)主界面:登陆界面,通过选择用户类型,输入用户名密码,点击登录进入不同界面。
2)子界面:不同用户类型的界面不相同,学生可以查询成绩,老师可以查看自己所教课程有哪些学习,教务员可以实现排课功能。
他们都能够修改自己的登录密码6.2、系统界面与源代码6.2.1、界面登陆界面学生界面老师界面6.2.2、功能描述1)登录2)学生查询学习课程的成绩3)老师查询学习所教课程的学生名单4)修改登录密码5)查看用户基本信息6.2.3、程序源代码using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace 教务管理系统{public struct UserInform //结构体存储用户输入的信息{public static string UserType;public static string UserName;public static string UserSecret;public static LoginForm lg;}public partial class LoginForm : Form //登陆界面{public LoginForm(){InitializeComponent();UserInform.lg= this;}DataClasses1DataContext db;private void Cancelbutton_Click(object sender, EventArgs e){this.Close();}private void Loginbutton_Click(object sender, EventArgs e){db = new DataClasses1DataContext();this.bindingSource1.DataSource = erInfo;bool b = false;if (UtypecomboBox.SelectedIndex!=-1){erName = UnametextBox.Text;erSecret = UsecrettextBox.Text;erType = UtypecomboBox.SelectedItem.ToString();var ss = from s in erInfo where s.Utype == erType select s;foreach (var x in ss){if (x.Uname.ToLower()== erName.ToLower()&& ecret == erSecret){MessageBox.Show("欢迎您登陆");this.Visible = false;b = true;switch (erType){case "学生": StudentForm sf = new StudentForm();sf.Show();break;case "老师": TeacherForm tf = new TeacherForm();tf.Show();break;case "管理员": AdminForm af = new AdminForm();af.Show();break;case "教务员": JwForm jw = new JwForm();jw.Show();break;}}}if (!b){MessageBox.Show("用户名不存在或密码错误");UsecrettextBox.Clear();UnametextBox.Focus();return;}}else{MessageBox.Show("请选择用户类型");UnametextBox.Clear();UsecrettextBox.Clear();UnametextBox.Focus();return;}}}public partial class StudentForm : Form //学生界面{public StudentForm(){InitializeComponent();}DataClasses1DataContext db;private void StudentForm_Load(object sender, EventArgs e){db = new DataClasses1DataContext();SnotextBox.Text = erName;SnotextBox1.Text = erName;var ss = from s in db.Student where s.Sno == erName select s;foreach (var itm in ss){SnametextBox.Text = itm.Sname;SagetextBox.Text = itm.Sage.ToString();SsextextBox.Text = itm.Ssex;}}private void label4_Click(object sender, EventArgs e){this.Close();UserInform.lg.Visible = true;}private void label3_Click(object sender, EventArgs e){panel2.Visible = true;}private void Enterbutton_Click(object sender, EventArgs e){db = new DataClasses1DataContext();if (textBox1.Text == ""){MessageBox.Show("请输入原密码");textBox1.Clear();textBox2.Clear();textBox3.Clear();textBox1.Focus();}else if (textBox1.Text == erSecret){if(textBox2.Text==textBox3.Text){var ss = from s in erInfo where s.Uname == erName && s.Utype == erType select s;var ui = ss.FirstOrDefault();if (ui != null){ecret = textBox2.Text;db.SubmitChanges();MessageBox.Show("修改成功");textBox1.Clear();textBox2.Clear();textBox3.Clear();panel2.Visible = false;}}else{MessageBox.Show("两次输入应相同");textBox3.Clear();textBox3.Focus();}}else{MessageBox.Show("原密码输入错误,请重新输入");textBox1.Clear();textBox2.Clear();textBox3.Clear();textBox1.Focus();}}private void Cancelbutton_Click(object sender, EventArgs e){textBox1.Clear();textBox2.Clear();textBox3.Clear();panel2.Visible = false;}private void StudentForm_FormClosing(object sender, FormClosingEventArgs e) {db = new DataClasses1DataContext();this.bindingSource1.DataSource = erInfo;try{this.bindingSource1.EndEdit();db.SubmitChanges();}catch (Exception ex){MessageBox.Show(ex.Message, "失败");}}private void Gradebutton_Click(object sender, EventArgs e){db = new DataClasses1DataContext();if (CnametextBox.Text != ""){var ss = from s in db.Course where ame == CnametextBox.Text select s;var cs = ss.FirstOrDefault();if (cs != null){var s1 = from s2 in db.Grade where s2.Gkehao == o && s2.Gxuehao == erName select s2;foreach (var item in s1){GradelistBox.Items.Add(CnametextBox.Text + "的成绩为" + item.Ggrade.ToString());}}else{GradelistBox.Items.Add("此课程不存在")GradelistBox.Items.Add("请重新输入");CnametextBox.Clear();CnametextBox.Focus();}}}private void Clearbutton_Click(object sender, EventArgs e) {GradelistBox.Items.Clear();}private void tabPage1_Click(object sender, EventArgs e){}} public partial class TeacherForm : Form //老师界面{public TeacherForm(){InitializeComponent();}DataClasses1DataContext db;private void Enterbutton_Click(object sender, EventArgs e) {db = new DataClasses1DataContext();if (textBox1.Text == ""){MessageBox.Show("请输入原密码");textBox1.Clear();textBox2.Clear();textBox3.Clear();textBox1.Focus();}else if (textBox1.Text == erSecret){if (textBox2.Text == textBox3.Text){var ss = from s in erInfo where s.Uname == erName && s.Utype == erType select s;var ui = ss.FirstOrDefault();if (ui != null){ecret = textBox2.Text;db.SubmitChanges();MessageBox.Show("修改成功");textBox1.Clear();textBox2.Clear();textBox3.Clear();panel2.Visible = false;}}else{MessageBox.Show("两次输入应相同");textBox3.Clear();textBox3.Focus();}}else{MessageBox.Show("原密码输入错误,请重新输入");textBox1.Clear();textBox2.Clear();textBox3.Clear();textBox1.Focus();}}private void label4_Click_1(object sender, EventArgs e){this.Close();UserInform.lg.Visible = true;}private void TeacherForm_Load(object sender, EventArgs e){db = new DataClasses1DataContext();SnotextBox.Text = erName;SnotextBox1.Text = erName;var ss = from s in db.Teacher where s.Tno == erName select s;foreach (var itm in ss){SnametextBox.Text = itm.Tname;SagetextBox.Text = itm.Tage.ToString();SsextextBox.Text = itm.Tsex;}}private void TeacherForm_FormClosing(object sender, FormClosingEventArgs e) {db = new DataClasses1DataContext();this.bindingSource1.DataSource = erInfo;try{this.bindingSource1.EndEdit();db.SubmitChanges();}catch (Exception ex){MessageBox.Show(ex.Message, "失败");}}private void label3_Click(object sender, EventArgs e){if (panel2.Visible == false){panel2.Visible = true;}else{panel2.Visible = false;}}private void Cancelbutton_Click(object sender, EventArgs e){textBox1.Clear();textBox2.Clear();textBox3.Clear();panel2.Visible = false;}private void label5_Click(object sender, EventArgs e){db = new DataClasses1DataContext();var ss = from s in db.Teach where s.Tno == erName select s;if (ss != null){SelectTable st = new SelectTable();foreach (var item in ss){if (item.Tcno.StartsWith("X")){var s1 = from s in db.Student where s.Skehao == item.Tcno select new { 课号= s.Skehao, 学号= s.Sno, 学生姓名= s.Sname, 性别= s.Ssex, 成绩= s.Sgrade };st.lb.Items.Add("课号\t学号\t\t姓名\t性别\t成绩");foreach (var im in s1){st.lb.Items.Add(im.课号+"\t"+im.学号+"\t"+im.学生姓名+"\t"+im.性别+"\t"+im.成绩);}}else{var s1 = from s in db.Grade where s.Gkehao == item.Tcno select s;st.lb.Items.Add("课号\t学号\t\t姓名\t性别\t成绩");foreach (var itm in s1){var s2 = from s in db.Student where s.Sno== itm.Gxuehao select new {课号=itm.Gkehao,学号= itm.Gxuehao,学生姓名= s.Sname, 性别=s.Ssex,成绩= itm.Ggrade };var iem = s2.FirstOrDefault();st.lb.Items.Add(iem.课号+ "\t" + iem.学号+ "\t" + iem.学生姓名+ "\t" + iem.性别+ "\t" + iem.成绩);}}}st.Show();}else{MessageBox.Show("该老师今年没有教授任何课程");return;}}private void label6_Click(object sender, EventArgs e){db = new DataClasses1DataContext();var ss = from s in db.Teach where s.Tno == erName select s;if (ss != null){GradeChange gc = new GradeChange();foreach (var item in ss){if (item.Tcno.StartsWith("X")){var s1 = from s in db.Student where s.Skehao == item.Tcno select new { 课号= s.Skehao, 学号= s.Sno, 学生姓名= s.Sname, 性别= s.Ssex, 成绩= s.Sgrade };gc.lb.Items.Add("课号\t学号\t\t姓名\t性别\t成绩");foreach (var im in s1){gc.lb.Items.Add(im.课号+ "\t" + im.学号+ "\t" + im.学生姓名+ "\t" + im.性别+ "\t" + im.成绩);}}else{var s1 = from s in db.Grade where s.Gkehao == item.Tcno select s;gc.lb.Items.Add("课号\t学号\t\t姓名\t性别\t成绩");foreach (var itm in s1){var s2 = from s in db.Student where s.Sno == itm.Gxuehao selectnew { 课号= itm.Gkehao, 学号= itm.Gxuehao, 学生姓名= s.Sname, 性别= s.Ssex, 成绩= itm.Ggrade };var iem = s2.FirstOrDefault();gc.lb.Items.Add(iem.课号+ "\t" + iem.学号+ "\t" + iem.学生姓名+ "\t" + iem.性别+ "\t" + iem.成绩);}}}gc.Show();}else{MessageBox.Show("该老师今年没有教授任何课程");return;}}}}七、设计总结在本次数据库课设中,我设计的是教务管理系统,实现了不同的用户如学生,老师,管理员等进入不同的界面,享有不同的权限,访问不同数据。