洛 阳 理 工 学 院
课 程 设 计 报 告
课程名称 数据库课程设计
设计题目 教务管理系统
专 业 计算机科学与技术
班 级
学 号
姓 名
完成日期
课 程 设 计 任 务 书 |
设计题目: 教务管理系统 设计内容与要求: 设计教务管理系统,类似于我校教务管理系统,有四类用户:教务员、学生、教师、管理员教务员可以输入学生、教师、班级、课程信息。一个班级只属于一个专业,一个学生只属于一个班级。教务员负责输入每个专业、每个班级需要学习哪些课程,指定课程的任课教师。教师可以查看学习该课程的学生名单。课程结束后,教师可以录入课程成绩。一个教师可以教授多个班的多门课程,每门课由多位老师讲授。课程分两类,必修课和选修课。系统要记录每个学生学习各门必修课的成绩,还要记录学生选修了哪些选修课以及课程成绩。学生可以查看自己各门课程的成绩。学生还可以进行评教,给老师打分。管理员可以输入教室信息,并结合班级、课程、教室信息实现自动排课。 要求: 1.完成本系统的需求分析,写出功能需求和数据需求描述; 2.完成数据库的概念结构设计、逻辑结构设计、物理结构设计; 3.完成本系统的部分功能模块的程序界面设计。 指导教师: 2017 年 12 月 29 日 |
课 程 设 计 评 语 |
成绩: 指导教师:_______________ 年 月 日 |
1、 概述 ...........................................................2
1.1、本设计的目的与意义............................................2
1.2、数据库开发工具和应用程序开发工具..............................2
2、 需求分析........................................................2
2.1功能需求.......................................................2
2.2数据需求.......................................................2
3、 概念结构设计....................................................2
3.1、E-R模型设计..................................................2
3.2、总体E-R图描述...............................................4
4、 逻辑结构设计...................................................4
4.1、关系模型.....................................................4
4.2、关系模式的优化与说明.........................................4
5、 物理结构设计....................................................5
5.1建立数据库.....................................................5
5.2表与表结构.....................................................5
6、 应用程序设计....................................................6
6.1、系统总体结构..................................................6
6.2、系统界面与源代码..............................................7
6.2.1、界面........................................................8
6.2.2、功能描述....................................................9
6.2.3、程序源代码.................................................10
七、设计总结........................................................23
一、 概述
本系统后台数据库采用Microsoft SQL Server 数据库,该数据库系统在安全性、准确性和运行速度方面有绝对的优势,并且处理数据量大,效率高;前台采用Microsoft 公司的Visual Studio 2010作为主要开发工具,可与SQL Server 2008数据库无缝链接。
2、 需求分析
2.1、功能需求
本系统的功能如下:
1)学生信息查询:学生可以根据学号、姓名、专业进行查询.
2)学生信息管理:主要是用于学生信息更新、插入、删除;
3)学生成绩录入:用于学生成绩管理,录入学生成绩,也可以更新;
2.2、数据需求
本系统需要的数据如下:
学生:学号、姓名、性别、年龄
教师:工号、姓名、性别、年龄
班级:班号、班名、人数、
课程:课程号、课程名、上课时间、上课地点
专业:专业号、专业名
3、 概念结构设计
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)表的结构
管理员(admin)表的结构
六、应用程序设计
6.1、系统总体结构
1)主界面:登陆界面,通过选择用户类型,输入用户名密码,点击登录进入不同界面。
2)子界面:不同用户类型的界面不相同,学生可以查询成绩,管理员可以添加学生信息以及查询删除学生信息。
6.2、系统界面与源代码
6.2.1、界面
登陆界面
学生界面
管理员界面
6.2.2、功能描述
1)学生查询学习课程的成绩
2)管理员管理学生信息
4)管理员添加学生信息
5)管理员删除学生信息
5)删除学号为1的触发触发器功能
6.2.3、程序源代码
管理员实现查询、删除功能的代码(删除学号为1的用到了触发器):
package Manager.zhen;
import java.awt.*;
import java.awt.EventQueue;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.ComboBoxModel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.JComboBox;
import javax.swing.JDesktopPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class Form_edit extends JInternalFrame {
private JDesktopPane Desktop;
private DbUtil dbUtil = new DbUtil();
private JPanel contentPane;
private JTextField txt_sno;
private JTable table;
private JTextField txtsname;
private JTextField txtcno;
private JTextField txtgrade;
private JTextField txtsno;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Form_bookedit frame = new Form_bookedit();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Form_edit() {
setEnabled(false);
setClosable(true);
setTitle("\u67E5\u8BE2\u6210\u7EE9");
//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 487, 412);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
JLabel lblNewLabel = new JLabel("\u8F93\u5165\u4F60\u7684\u5B66\u53F7\uFF1A");
txt_sno = new JTextField();
txt_sno.setColumns(10);
JButton btn_searchgrade = new JButton("\u67E5\u8BE2\u6210\u7EE9");
btn_searchgrade.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
SearchActionPerformed(arg0);
}
});
JLabel lblNewLabel_2 = new JLabel("\u6210\u7EE9\u5982\u4E0B\uFF1A");
JScrollPane scrollPane = new JScrollPane();
scrollPane.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
mousePressed(e);}
});
JLabel lblNewLabel_1 = new JLabel("\u5B66 \u53F7");
JLabel lblNewLabel_3 = new JLabel("\u59D3 \u540D");
JLabel lblNewLabel_4 = new JLabel("\u73ED \u7EA7");
JLabel lblNewLabel_5 = new JLabel("\u6210 \u7EE9");
txtsname = new JTextField();
txtsname.setColumns(10);
txtcno = new JTextField();
txtcno.setColumns(10);
txtgrade = new JTextField();
txtgrade.setColumns(10);
JButton btnalter = new JButton("\u4FEE\u6539");
btnalter.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ModifyActionPerformed(e);
}
});
JButton btndelete = new JButton("\u5220\u9664");
btndelete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DelActionPerformed(e);
}
});
JComboBox usertype = new JComboBox();
txtsno = new JTextField();
txtsno.setColumns(10);
GroupLayout gl_contentPane = new GroupLayout(contentPane);
gl_contentPane.setHorizontalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addContainerGap() .addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING) .addGroup(gl_contentPane.createSequentialGroup()
.addComponent(lblNewLabel) .addPreferredGap(ComponentPlacement.RELATED)
.addComponent(txt_sno, GroupLayout.PREFERRED_SIZE, 125, GroupLayout.PREFERRED_SIZE) .addPreferredGap(ComponentPlacement.RELATED, 89, Short.MAX_VALUE)
.addComponent(btn_searchgrade)
.addGap(29))
.addGroup(gl_contentPane.createSequentialGroup()
.addComponent(lblNewLabel_2)
.addContainerGap(372, Short.MAX_VALUE))
.addGroup(gl_contentPane.createSequentialGroup()
.addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 433, Short.MAX_VALUE)
.addContainerGap())
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(46) .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING, false) .addGroup(gl_contentPane.createSequentialGroup() .addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING, false)
.addComponent(lblNewLabel_1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(lblNewLabel_3, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addComponent(txtsname, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(txtsno, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addGap(41) .addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING, false)
.addComponent(lblNewLabel_4, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(lblNewLabel_5, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addComponent(txtcno, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(txtgrade, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addGap(32))
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(10)
.addComponent(btnalter)
.addPreferredGap(ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btndelete)
.addGap(62))))))
);
gl_contentPane.setVerticalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addContainerGap()
.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
.addComponent(lblNewLabel)
.addComponent(txt_sno, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(btn_searchgrade))
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(lblNewLabel_2)
.addGap(18)
.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 139, GroupLayout.PREFERRED_SIZE)
.addGap(18)
.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
.addComponent(lblNewLabel_1)
.addComponent(lblNewLabel_4)
.addComponent(txtcno, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(txtsno, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addPreferredGap(ComponentPlacement.UNRELATED)
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
.addComponent(lblNewLabel_3)
.addComponent(txtsname, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
.addComponent(lblNewLabel_5)
.addComponent(txtgrade, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addComponent(btnalter)
.addComponent(btndelete))
.addContainerGap(31, Short.MAX_VALUE))
);
table = new JTable();
table.setModel(new DefaultTableModel(
new Object[][] {
},
new String[] {
"\u5B66\u53F7", "\u59D3\u540D", "\u73ED\u7EA7", "\u6210\u7EE9"
}
));
scrollPane.setColumnHeaderView(table);
scrollPane.setViewportView(table); // 让表列标题显示出来
contentPane.setLayout(gl_contentPane);
}
public Form_edit(JDesktopPane table1) {
this();
this.Desktop=table1;
//设置窗体居中显示
this.setLocation((table1.getWidth()-this.getWidth())/2,(table1.getHeight()-this.getHeight())/2);
}
private void fillTable(String Sno) {
// TODO Auto-generated method stub
DefaultTableModel dtm= (DefaultTableModel)table.getModel();
dtm.setRowCount(0);//清空原来的记录
///连接数据库
Connection con=null;
try{//数据库查询,并填充到JTABLE
con=dbUtil.getCon();
//下面可以写数据库访问语句,并执行。
Statement stmt = con.createStatement();// 创建SQL命令对象
String sql = "select Sno,Sname,Cno,Sgrade from student where Sno like '%"+Sno.trim() +"%'"; // 定义查询语句
PreparedStatement pstm=con.prepareStatement(sql);
ResultSet rs=pstm.executeQuery();
// JOptionPane.showMessageDialog(null, "查询成功!");
while(rs.next()){
Vector v=new Vector();
v.add(rs.getString("Sno"));
v.add(rs.getString("Sname"));
v.add(rs.getString("Cno"));
v.add(rs.getString("Sgrade"));
dtm.addRow(v);
}
// 数据库查询结束,最后关闭连接
stmt.close();// 关闭命令对象连接
}
catch(Exception e1)
{
e1.printStackTrace();
}
// finally
// {
// try {
// dbUtil.closeCon(con);
// } catch (Exception e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
// }
}
private void ModifyActionPerformed(ActionEvent evt) {
if (txtsname.getText().isEmpty()){
JOptionPane.showMessageDialog(null, "请选择一条要修改的记录!");
return;
}
Connection conn=null;
String sql="update 图书 set 书名=?,作者=? where 书号=? ";
try {
conn=dbUtil.getCon();
PreparedStatement pstm=conn.prepareStatement(sql);
pstm.setString(1, txtcno.getText());
pstm.setString(2, txtsname.getText());
pstm.setString(3, txtgrade.getText());
int count=pstm.executeUpdate();
if (count==0){
JOptionPane.showMessageDialog(null, "修改失败!");
}
else{
JOptionPane.showMessageDialog(null, "修改成功!");
fillTable("");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if (conn!=null)
dbUtil.closeCon(conn);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void DelActionPerformed(ActionEvent evt) {
if (txtsno.getText().isEmpty()){
JOptionPane.showMessageDialog(null, "请选择一条要删除的记录!");
return;
}
Connection conn=null;
//
int count=0;
String sno=txtsno.getText().toString();
String sql="delete from Student where Sno=?";
//
try {
conn=dbUtil.getCon();
PreparedStatement pstm=conn.prepareStatement(sql);
pstm.setString(1,sno);
//删除选中学生
count=pstm.executeUpdate();
if (count==0){
JOptionPane.showMessageDialog(null, "删除失败!");
}
else{
JOptionPane.showMessageDialog(null, "删除成功!");
fillTable("");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if (conn!=null)
dbUtil.closeCon(conn);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void SearchActionPerformed(ActionEvent e) {
// 根据学号进行查找
fillTable(txt_sno.getText().trim());
}
protected void MousePressed(MouseEvent e) {
// TODO Auto-generated method stub
int currRow=table.getSelectedRow();
txtsno.setText(table.getValueAt(currRow, 0).toString());
txtsname.setText(table.getValueAt(currRow, 1).toString());
txtcno.setText(table.getValueAt(currRow, 2).toString());
txtgrade.setText(table.getValueAt(currRow, 3).toString());
}
// JOptionPane.showMessageDialog(null,n);
}
7、总结
在这次数据库的课程设计中,我选的的是教务管理系统的题目,实现了不同的用户如学生,管理员等进入不同的界面,享有不同的权限,访问不同数据。
在做此次课程设计的前一两天是比较容易的,主要把数据库建立好以及将数据库的一些功能,比如触发器,存储过程。
但是后面几天因为要连接java软件来实现系统的功能,需要将功能可视化,也就是需要java代码来实现,因为又有考试,需要复习,所以实验之后的时间都用来复习了,所以比较慢。
虽然推迟了几天,但是由于时间短,仅实现部分功能,基本上完善了学生和管理员的设计,学生可以查询学习成绩,管理员可以实现学生信息的查询以及添加学生信息的功能,还有删除学生信息的功能。通过课设,我体会了一个相对简单的系统的编写过程,编写的过程可以说并不是很难,但是却很繁琐,因为不同功能的实现需要对图形的编辑以及给每个按钮赋予不同的功能。
本文来源:https://www.2haoxitong.net/k/doc/165afe56534de518964bcf84b9d528ea80c72f64.html
文档为doc格式