数据库设计报告
学生选课系统
目录
数据库设计报告... 1
1.系统概述... 2
2.系统分析... 2
2.1需求分析... 2
2.2可行性分析... 2
3.总体设计... 3
3.1项目规划... 3
3.2系统功能结构图... 3
4系统设计... 4
4.1设计目标... 4
4.2开发及运行环境... 4
4.3学生选课系统的详细设计... 4
4.3.1 登录界面的设计... 4
4.3.2 新用户的注册... 8
4.3.3 关于学生选课的部分... 12
4.3.4 数据库的设计... 18
5.实验总结... 21
1.系统概述
现在大学中大学生的人数越来越多,而在校期间学生要根据每个学生所选课程进行管理,要使每名学生所选的课程准确无误,这无疑就给从事学生选课管理工作的管理人员带来了巨大的压力。虽然单机版本的学生选课管理系统软件在一定的程度上可以解决问题,可是在信息网络化的现实面前,它的不足之处就显而易见了。首先,选课管理系统的使用对象过于单一,仅局限于学校管理者;其次,学生不能通过网络及时预选、正选、退补选等操作,随之带来了信息的全面性、即时性、有效性等方面的问题。再次,还存在软件版本更新比较麻烦的问题。本次设计就是在小范围的一个尝试,所列入的课程名称和课程数目可由老师确定和修改。同时,随着网络的发展,人们通过网络可以更方便更快捷交流、学习、教育、商业贸易等等。为了促进学校与学生能更好的学习沟通,充分利用学校现有的资源,更实现了无纸化办公节省了日常开销,所以决定开发学生网上选课系统,使选课这一教学环节方便化,简单化,既方便了同学们选课,又减轻了老师的工作量,提高了老师的工作效率。避免了工作中带来的失误,对每个学生的选课情况一目了然,充分发挥了网络给人们的优势。
2.系统分析
2.1需求分析
数据库是一种存储数据并对数据进行操作的工具。数据库的作用在于组织和表达信息,简而言之,数据库就是信息的集合。计算机的数据库可以分为两类:非关系数据库和关系数据库。关系数据库中包含了多个数据表的信息,数据库含有各个不同部分的术语,如记录、域等。
SQL2000 就是关系数据库开发工具,数据库能汇集各种信息以供查询、存储和检索。SQL 的优点在于它集数据查询、数据操纵、数据定义和数据控制功能于一体。
2.2可行性分析
网上选课系统是针对在校学生和教师使用,从学生的角度来说,由于学校教学制度的改革,现在大部分高等院校开始实行的是学生的自主选课模式,传统的教学模式——学生按照学校安排好的课程上课——已经不能适应新型的教学手段,如果仍然通过纸上的方式选课,一方面浪费的大量的人力、物力资源,另一方面浪费时间以及在人为的统计过程中不可避免出现的差错等情况。随着高校人数的增多,这种弊端会越来越多的暴露出来。因此,利用网络,使学生只要在计算机前输入自己的个人选课信息即可完成原来几倍的作业量。从教师的角度来说,同样是节省了大量的工作量,由于教师提出代课申请完成课程发布的工作较学生选课而言更加的复杂,因此通过网上进行课程发布能大幅度的减少教师的工作量,减少错误的发生几率。作为教师,也只要通过自己的电脑来操作即可,不用再奔波于教务处和办公室之间。以MIS系统的构建思想来实现网上选课系统可以最大程度的做到实用性,可扩展性和可维护性相结合,安全性以及规范化原则。
经济可行性:此系统是纯粹是本人为了完成毕业设计而独立设计开发的,不存在任何的商业目的和经济利益等因素。由于本系统是为学生选课管理使用的系统,装上该应用软件,即可使用系统,系统成本主要集中在系统软件的开发上,当系统投入运行后可以为学校节约大量的人力,物力。所带来的效益远远大于系统软件的开发成本。在经济上完全可行。
·技术可行性:此系统是本人独立设计和开发的,其规模小,开发周期短,整个开发过程由一人配置一台电脑即可完成。此系统的使用者都是在校大学生,且数据库的内容有较强的关联性,涉及的选课过程不是很复杂,由于有老师指导和对相关参考文献,特别是网上资料的搜集分析,经过认真思考运用软件工程的知识完全是可以实现的。
·操作可行性:界面设计时充分考虑管理人员的习惯,使得操作简单;数据录入迅速、规范、可靠;统计准确;制表灵活;适应力强;容易扩充。
·法律可行性:此系统是本人独立设计和开发的,不存在合同责任、侵犯专利权等法律问题,因此不会在社会上引起侵权或其它责任等问题。
所以决定运用java和sql2000来实现实现学生注册、预选、正选、退补选等网上选课的主要功能。
3.总体设计
3.1项目规划
1.整体的项目就分为前台和后台,前台也就是用户通过浏览器看到的界面,而后台就是对数据库的一些操纵。
2.就目前来看,我们做的这个学生选课系统还是十分简单的一个小的系统,虽然不能满足所有的功能需求,但是基本的学生选课所需要的功能这个系统全部就满足了。包括学生的登录,学生的选课,学生的选课信息查看等功能。
3.2系统功能结构图
4系统设计
4.1设计目标
对于典型的数据库管理系统,尤其是对于像学生选课系统这样的数据量特别大的网络管理系统,必须满足使用方便、操作灵活等要求。本系统在设计时应该满足以下目标:
l 采用人机对话的操作方式,界面美观、有好。信息查询灵活、方便,数据存储准确、安全可靠、
l 对于已经登录的用户能过快速的响应点击要求。
l 便于学生快捷地进行课程信息的查询。
l 学生随时可以修改个人资料。
l 快速的响应学生对选课,和已选课程的查询。
l 系统最大限度地实现了易维护性和易操作性。
l 系统运行稳定、安全可靠。
4.2开发及运行环境
硬件平台:
l CUP:i3处理器
l 内存:2G
软件平台:
l 操作系统:windows7
l 数据库:sql 2000
l 开发工具包:JDK Version1.5
l 浏览器:IE8及以上版本
4.3学生选课系统的详细设计
4.3.1 登录界面的设计
登录界面我们考虑了一下,就简单做了一下,但是具备应有的功能。用户名和密码输入这不用说,但是我们的代码中增加了对用户名和密码格式和长度等字符要求的控制,一旦用户出现不符合的情况,就立即显示输入错误。
下面是我们的登录界面和代码
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class Login implements ActionListener{
JFrame frame;//登录窗口
JLabel label[];//显示信息
JTextField tf;//学号输入框
JPasswordField pf;//密码输入框
JButton button[];
public Login(){
this.login();
}
public void login(){
frame=new JFrame();
frame=new JFrame("成都理工大学选课系统");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getGraphicsConfiguration().getDevice().setFullScreenWindow(frame);
frame.setLayout(null);
frame.setBounds(100,10,1000,500);
frame.setVisible(true);
//文本显示标签
label=new JLabel[4];
label[0]=new JLabel();
label[0].setBounds(490,170,200,50);
label[0].setText("登录 选课");
label[0].setFont(new Font("方正舒体",1,24));
frame.add(label[0]);
label[1]=new JLabel();
label[1].setBounds(400,240,200,50);
label[1].setText("学号");
frame.add(label[1]);
label[2]=new JLabel();
label[2].setBounds(400,280,200,50);
label[2].setText("密码");
frame.add(label[2]);
//学号输入框
tf=new JTextField();
tf.setBounds(450,250,200,30);
frame.add(tf);
//密码输入框
pf=new JPasswordField();
pf.setBounds(450,290,200,30);
frame.add(pf);
button=new JButton[2];
//登录按钮
button[0]=new JButton("登录");
button[0].setBounds(450,350,60,40);
button[0].addActionListener(this);
frame.add(button[0]);
//注册按钮
button[1]=new JButton("注册");
button[1].setBounds(540,350,60,40);
button[1].addActionListener(this);
frame.add(button[1]);
frame.repaint();
}
public String[] getIdAndPassword(JTextField tf,JPasswordField pf){
String s[]=new String[2];
s[0]=tf.getText();
s[1]=String.valueOf(pf.getPassword());
return s;
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand()=="登录"){
String s[]=this.getIdAndPassword(tf, pf);
String sqlQ="select sid,spassword from student where sid='"+s[0]+"' and spassword='"+s[1]+"';";
//System.out.println(sqlQ);
MySql mysql=null;
ResultSet rs=null;
boolean b=false;//用来判断是否有这个用户存在
try {
mysql=new MySql();
rs=mysql.stmt.executeQuery(sqlQ);
while(rs.next()){
b=true;
}
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(b){
System.out.println(tf.getText());
SC c=new SC("201113040418");
}
if(!b){
JOptionPane.showMessageDialog(null,"登录失败");
}
}
if(e.getActionCommand()=="注册"){
Register r=new Register();
}
}
}
4.3.2 新用户的注册
就新用户的注册来说就没有登录那么简单了,毕竟一个新的用户注册需要输入很多的用户信息,所以程序就稍稍有点复杂,除了用户界面的布局外,对用户输入字符串的控制必须要做到位,让用户输入符合系统的信息。
下面就是新用户注册界面和代码了:
public class Register implements ActionListener{
JFrame frame;
JLabel label[];//文本显示
JButton determine;
JButton cancel;
JTextField tf[];//信息输入框
JPasswordField pf[];//密码输入框
public Register(){
this.register();
}
public void register(){
frame=new JFrame("Register");
//frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
frame.setBounds(400,100,400,500);
frame.setVisible(true);
label=new JLabel[12];
label[0]=new JLabel();
label[0].setBounds(20,15,400,40);
label[0].setFont(new Font("方正舒体",1,22));
label[0].setText(" 学生注册信息填写处");
frame.add(label[0]);
String s1[]=new String[]{"学号","姓名","性别","年龄","所在系","专业","电话号码","寝室号","家庭地址","密码","确认密码"};
for(int i=1;i<12;i++){
label[i]=new JLabel();
label[i].setBounds(20,20+i*30,400,30);
label[i].setText(s1[i-1]);
frame.add(label[i]);
}
tf=new JTextField[9];
String s2[]=new String[]{"201113040418","付红桃","男","21","信科院","软件工程","136****6354","松二-241","四川省三台县建中乡五村七队"};
for(int i=0;i<9;i++){
tf[i]=new JTextField();
tf[i].setVisible(true);
tf[i].setPreferredSize(new Dimension(1, 5));//
tf[i].setText(s2[i]);
tf[i].setFont(new Font("常规",1,16));
tf[i].setBounds(100,55+i*30,200,30);
frame.add(tf[i]);
}
//密码输入框
pf=new JPasswordField[2];
pf[0]=new JPasswordField();
pf[0].setVisible(true);
pf[0].setBounds(100,325,200,30);
pf[0].setEchoChar('*');
frame.add(pf[0]);
//密码确认框
pf[1]=new JPasswordField();
pf[1].setVisible(true);
pf[1].setBounds(100,355,200,30);
pf[1].setEchoChar('*');
frame.add(pf[1]);
//确认注册
determine=new JButton("注册");
determine.setBounds(90,400, 80, 50);
frame.add(determine);
determine.addActionListener(this);
//取消注册
cancel=new JButton("帮助");
cancel.setBounds(230,400, 80, 50);
frame.add(cancel);
cancel.addActionListener(this);
frame.repaint();
}
//得到输入框里面的信息
public String[] getInformation(JTextField tf[],JPasswordField pf[]){
String s[]=new String[tf.length+pf.length];
for(int i=0;i<tf.length;i++){
s[i]=tf[i].getText();
}
for(int i=0;i<pf.length;i++){
s[tf.length+i]=String.valueOf(pf[i].getPassword());
}
return s;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getActionCommand()=="注册"){
String s[]=this.getInformation(tf,pf);
//判断此用户在数据库中是否存在 不存在就不能够注册
boolean b1=true;
String sid=s[0];
String sname=s[1];
String sqlQ="select * from users where id='"+sid+"' and name='"+sname+"'";
//System.out.println(sqlQ);
MySql mysql=null;
try {
mysql=new MySql();
ResultSet rs=mysql.stmt.executeQuery(sqlQ);
if(!rs.next()){
b1=false;
JOptionPane.showMessageDialog(null,"数据库中没有这个用户,不能实现注册");
}
} catch (SQLException e1) {
System.out.println("用户查询出错");
}
// 判断用户输入的密码是否一样 如果不一样就得提示用户重新输入一次密码
boolean b2=true;
if(s[s.length-1].equals("")||!s[s.length-1].equals(s[s.length-2])){
b2=false;
JOptionPane.showMessageDialog(null,"密码输入不正确");
}
if(b1&&b2){
String sqlU="insert into student(sid,sname,ssex,sage,sdepartment,specialty,sphone,sroomid,saddress,spassword)" +
" values('"+s[0]+"','"+s[1]+"','"+s[2]+"',"+s[3]+",'"+s[4]+"','"+s[5]+"','"+s[6]+"','"+s[7]+"','"+s[8]+"','"+s[9]+"');";
//System.out.println(sqlU);
try {
mysql=new MySql();
mysql.stmt.executeUpdate(sqlU);
JOptionPane.showMessageDialog(null,"恭喜你,注册成功");
} catch (SQLException e1) {
//e1.printStackTrace();
JOptionPane.showMessageDialog(null,"对不起,注册失败\n可能是信息填写格式不对\n或者 已经注册");
}
}
}
if(e.getActionCommand()=="帮助"){
JOptionPane.showMessageDialog(null,"这个注册窗口只能是数据库User这个表里面存在的用户才能够注册," +
"\nUser表中只添加了软件四班的人," +
"\n软件四班的人可以凭自己的学号和姓名进行注册。" +
"\n其他的人因为不是系统中的人,所以不能够进行注册。");
}
}
}
顺便提一下注册过程中可能回出现的界面:
这几个界面是帮助用户进行注册的,提示用户在注册过程中出现的错误。
4.3.3 关于学生选课的部分
学生选课部分是学生选课系统的一个重要的部分,是学生选课系统的核心,为此我们下了大工夫来做这一部分。就学生选课呢,就是先为用户显示出目前学生能选择的课程,然后供用户通过在后面打对号的形式来选择适合自己的课。不得不说,虽然我们下了大工夫去做,单还是可能会有实现的不合理的地方,单基本上还是能够满足需求的。
下面就是用户界面和代码:
public class SC implements ActionListener{
private JTable table;
private JScrollPane sPane;
private DefaultTableModel model;
private JPanel pane;
private JFrame f;
private String sid="";
private JButton button;
private String course[][];
public SC(String sid){
this.sid=sid;
f=new JFrame("欢迎进入选课系统");
f.setSize(800, 400);
f.getGraphicsConfiguration().getDevice().setFullScreenWindow(f);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.setLayout(null);
button=new JButton("确定选课");
button.setVisible(true);
button.setBounds(1100,500,100,40);
button.addActionListener(this);
f.add(button);
this.addTable(f);//添加一个表格到JFrame上面
this.yiXuankechenghao();
}
public void addTable(JFrame f){
Object sc[][]=this.getObject();
String sx[]={"课程编号","课程名","学分","学时","选课"};
model = new DefaultTableModel(sc, sx);
table = new JTable(model);
TableColumn tc = table.getColumnModel().getColumn(4);
tc.setCellEditor(table.getDefaultEditor(Boolean.class));
tc.setCellRenderer(table.getDefaultRenderer(Boolean.class));
sPane = new JScrollPane();
sPane.setViewportView(table);
pane = new JPanel();
pane.setLayout(new FlowLayout());
sPane.setBounds(200,40,800,600);
f.add(sPane, BorderLayout.CENTER);
f.add(pane, BorderLayout.SOUTH);
}
public String [] yiXuankechenghao(){
String s="";
try {
MySql mysql=new MySql();
ResultSet rs=mysql.stmt.executeQuery("select ecid from elective where esid='"+sid+"';");
while(rs.next()){
s+=rs.getString("ecid")+"%";
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(s==""){
return null;
}
s=s.substring(0,s.length()-1);
String course[]=s.split("%");
return course;
}
public Object[][] getObject(){
String midsc[][]=this.getCourse();
Object sc[][]=new Object[midsc.length][5];
for(int i=0;i<midsc.length;i++){
for(int j=0;j<4;j++){
sc[i][j]=midsc[i][j];
}
/*应该增加一个访问数据库的代码 判断什么被选择了*/
String s[]=this.yiXuankechenghao();
if(s==null){
sc[i][4]=new Boolean("false");
}else{
boolean b=false;
for(int j=0;j<s.length;j++){
if(s[j].equals(sc[i][0])){
b=true;//代表这门课用户已经选择了
}
}
if(b){//这门课已经选择了
sc[i][4]=new Boolean("true");//设置这门课为勾 表示已选择
}else{
sc[i][4]=new Boolean("false");
}
}
}
return sc;
}
public String [][] getCourse() {
ResultSet rs=null;
String str="";
try {
MySql mysql=new MySql();
String s="select * from course;";
rs=mysql.stmt.executeQuery(s);
while(rs.next()){
str+=rs.getString("cid")+"%"+rs.getString("cname")+"%"+rs.getString("credit")+"%"+rs.getString("hours")+"#";
}
} catch (SQLException e){
e.printStackTrace();
}
String course[]=str.split("#");
String c[][]=new String[course.length][4];
for(int i=0;i<course.length;i++){
c[i]=course[i].split("%");
}
this.course=c;
return c;
}
@Override
public void actionPerformed(ActionEvent arg0) {
model = (DefaultTableModel) table.getModel();
int count = model.getRowCount();
for (int i = 0; i < count; i++) {
if (model.getValueAt(i, 4).equals(true)){
//在这里添加你要处理行的方法
String s="insert into elective(esid,ecid) values('"+sid+"','"+this.course[i][0]+"')";
try {
MySql mysql=new MySql();
mysql.stmt.execute(s);
} catch (SQLException e) {
}
}else{
String s="delete from elective where esid='"+sid+"' and ecid='"+this.course[i][0]+"';";
try {
MySql mysql=new MySql();
mysql.stmt.execute(s);
} catch (SQLException e) {
}
}
}
JOptionPane.showMessageDialog(null,"恭喜你,选课成功");
}
}
选课部分的功能有点多,我就一一介绍了,下面就一些次要的界面进行展示:
所选课程:
课程表的显示:
4.3.4 数据库的设计
就学生选课系统来说,数据库的设计就显得尤为的重要,这相当于人类的大脑,有一个好的数据库设计,就会对学生选课系统带来效率上的提升。
下面是数据库的代码:
ublic class MySql{
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
public MySql() throws SQLException{
SQL s=new SQL();
conn=s.getConn();
stmt=s.getStmt(conn);
// String sqlU="insert into user(id,name)" +
// " values('201113040418','付红桃');";
// stmt.executeUpdate(sqlU);
}
// public static void main(String args[]) throws SQLException{
// MySql s=new MySql();
//
// System.out.println("运行结束");
// }
}
class SQL{//数据库的操作类
public SQL(){
}
public Connection getConn() {//获取数据库的对象
Connection conn =null;
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动
String url= "jdbc:sqlserver://localhost:1433;databaseName=master";//定义URL
conn = DriverManager.getConnection(url,"sa","fht0527");//建立连接
}catch(Exception e){
e.printStackTrace();
System.out.println("数据库连接出错");
}
return conn;//返回一个数据库对象
}
public Statement getStmt(Connection conn){//获取执行sql语句的对象
Statement stmt =null;
try {
stmt = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("获取sql语句对象出错");
}
return stmt;
}
//查询
public ResultSet execQuery(String sql,Statement stmt){
ResultSet rs=null;
try {
rs=stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("sql查询语句出错");
}
return rs;
}
//执行sql语句,获取结果集
public int execcuteUpdate(String sql,Statement stmt){
int n=0;
try {
n=stmt.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("sql查询语句出错");
}
return n;
}
}
/*//JOptionPane.showMessageDialog(null,"数据库连接成功!");
//String sqlD="alter table student drop sex;";//删除某个属性
//s.execcuteUpdate(sqlD, stmt);
//删除一个元组
//String sqlD="delete from student where sno='201113040418';";
//stmt.execute(sqlD);
//插入一个元组
//String sqlU="insert into student(sno,sname,sex,age,dname,address) values('201113040418','付红桃','男',21,'信息科学与技术学院','四川省三台县建中乡五村七队');";
//int n=s.execcuteUpdate(sqlU, stmt);
//System.out.println(n);
//String sqlU=" update student set age=18 where sno='201113040423';";
//stmt.execute(sqlU);
//为某个表增加一个属性
//String sqlC="alter table student add sex char(1);";
//String sqlC="alter table student drop sex student;";
//"sex varchar(1)," +
//"age smallint" +
//"dname char(12)" +
//"address varchar(20)
//stmt.execute(sqlC);
//查询表
String sqlQ="select * from student;";
//sqlQ="select * from sc;";
//rs=s.execQuery(sqlQ, stmt);
rs=stmt.executeQuery(sqlQ);
while(rs.next()){
System.out.println(rs.getString("sno")+"\t"
+rs.getString("sname")+"\t"
+rs.getString("sex")+"\t"
+rs.getString("age")+"\t"
+rs.getString("dname")+"\t"
);
}
5.实验总结
通过这次课程设计,我学到了很多知识。以前对于数据库的编程从来都没有接触过,所以刚开始的时候感觉比较难,奋斗了一周多还不知道该从何入手。后来经过自己的努力,以及参考了一些资料,终于把数据库连接上了。由于时间比较短,随意就只做了个简单一点的学生课程管理系统。 虽然做的效果不怎么样,但这是我自己亲手做的,还是有一定的成就感的,毕竟自己的努力没有白费,我也学会了数据库编程的一些基本操作,实验中出现的问题通过上网、查资料我也都基本上解决了。 这次课程设计也增加了我的编程经验,使我的编程能力也得到了提高