数据库课程设计教务管理系统(共27页).doc
精选优质文档-倾情为你奉上洛 阳 理 工 学 院课 程 设 计 报 告 课程名称 数据库课程设计 设计题目 教务管理系统 专 业 计算机科学与技术 班 级 学 号 姓 名 完成日期 课 程 设 计 任 务 书设计题目: 教务管理系统 设计内容与要求:设计教务管理系统,类似于我校教务管理系统,有四类用户:教务员、学生、教师、管理员教务员可以输入学生、教师、班级、课程信息。一个班级只属于一个专业,一个学生只属于一个班级。教务员负责输入每个专业、每个班级需要学习哪些课程,指定课程的任课教师。教师可以查看学习该课程的学生名单。课程结束后,教师可以录入课程成绩。一个教师可以教授多个班的多门课程,每门课由多位老师讲授。课程分两类,必修课和选修课。系统要记录每个学生学习各门必修课的成绩,还要记录学生选修了哪些选修课以及课程成绩。学生可以查看自己各门课程的成绩。学生还可以进行评教,给老师打分。管理员可以输入教室信息,并结合班级、课程、教室信息实现自动排课。要求: 1.完成本系统的需求分析,写出功能需求和数据需求描述; 2.完成数据库的概念结构设计、逻辑结构设计、物理结构设计; 3.完成本系统的部分功能模块的程序界面设计。 指导教师: 2017 年 12 月 29 日课 程 设 计 评 语 成绩: 指导教师:_ 年 月 日专心-专注-专业目录一、 概述 .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、系统总体结构.66.2、系统界面与源代码.76.2.1、界面.86.2.2、功能描述.96.2.3、程序源代码.10七、设计总结.23一、 概述 本系统后台数据库采用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)表的结构 管理员(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("u67E5u8BE2u6210u7EE9");/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("u8F93u5165u4F60u7684u5B66u53F7uFF1A");txt_sno = new JTextField();txt_sno.setColumns(10);JButton btn_searchgrade = new JButton("u67E5u8BE2u6210u7EE9");btn_searchgrade.addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) SearchActionPerformed(arg0););JLabel lblNewLabel_2 = new JLabel("u6210u7EE9u5982u4E0BuFF1A");JScrollPane scrollPane = new JScrollPane();scrollPane.addMouseListener(new MouseAdapter() Overridepublic 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("u4FEEu6539");btnalter.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) ModifyActionPerformed(e););JButton btndelete = new JButton("u5220u9664");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 "u5B66u53F7", "u59D3u540D", "u73EDu7EA7", "u6210u7EE9");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 stubDefaultTableModel dtm= (DefaultTableModel)table.getModel();dtm.setRowCount(0);/清空原来的记录/连接数据库Connection con=null;try/数据库查询,并填充到JTABLEcon=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, "修改失败!");elseJOptionPane.showMessageDialog(null, "修改成功!");fillTable(""); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();finallytry if (conn!=null)dbUtil.closeCon(conn); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();private void DelActionPerformed(ActionEvent evt) if