资源描述
数据库与信息管理课程设计
一.实验题目:
托管培训中心信息管理系统
二.实验目的
《数据库与信息管理课程设计》是软件工程专业集中实践性环节之一,是计算机学科基础的一门重要的实践教学课程,是学习完《数据库概论》课程后进行的一次全面的综合练习.其目的在于加深对数据库基础理论和基本知识的理解,掌握使用数据库进行软件设计的基本方法,提高运用数据库解决实际问题的能力,最终实现对于给定的应用要求,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)。
三.实验要求
1.处理学生报名
根据学生报名的科目查询科目信息,如果该科目已经满员,则提醒学员,如果该科目没有满员,则让用户选择相应的教师,并报名登记,交纳学费.
2.维护科目
开设不同的科目,同一门课程根据教师的知名度,向学生收取不同的费用.
3.安排教室及上课日程
根据教师及学生信息确定某个科目的上课地点及时间,并形成学生的课表.
4.管理帐目
收取学费并入帐,催交费用等。
四.需求分析
托管培训中心信息管理系统,有两类用户:
一是培训中心的管理者,可添加、删除、修改、查询学生信息、课程信息、账目信息等,是托管中心信息管理系统的最高权力者。添加、删除、修改时,若遇到类型不匹配或破坏了数据库完整性,应弹出相应的提示对话框,查询时,应尽量使信息一目了然;
另一个用户则是学生用户,学生可查询课程信息、教师信息、个人课表和个人账目信息,可选课并自助交费。选课时,让学生选择课程和教师,若该课程人数已满,则提示报名人数已满,若该生已经选择该课程,也提示您已经选择了该课程,力争使软件的操作性友好。
为了便于管理,管理员编号为以“00”开头的四位数字,教师编号为以“01”开头的四位数字,学生编号为以“02”开头的四位数字,这样在登陆时,系统就可以通过判断编号类型,调用不用的界面。
当有学生注册或添加教师或课程时,系统将自动生成学生号、教师号、课程号,为了防止删除时产生编号的缺失,系统在分配编号时,将分配给新数据当前未使用的最小编号,填补之前删除的数据的空白,这样就能保证编号的连续性。
数据字典:
1。管理员表
表名:Manager
字段名
类型
备注
Mno
Varchar
管理员编号
Mname
Varchar
管理员姓名
Mpassword
Varchar
登陆密码
2.学生表
表名:Student
字段名
类型
备注
Sno
Varchar
学生编号
Sname
Varchar
学生姓名
Spassword
Varchar
登陆密码
3。教师表
表名:Teacher
字段名
类型
备注
Tno
Varchar
教师编号
Tname
Varchar
教师姓名
Tlevel
Varchar
教师等级
Tcharacter
Varchar
教师特点
4.课程表
表名:Course
字段名
类型
备注
Cno
Varchar
课程号
Cname
Varchar
课程名
Tno
Varchar
教师号
Cneed_Student
Int
招生人数
Class_Time
Varchar
学时
Ccycle
Varchar
课程周期
Caddr
Varchar
上课地点
Camount
int
学费
5.账目表
表名:SC_Amount
字段名
类型
备注
Cno
Varchar
课程号
Sno
Varchar
学生号
My_Amount
Int
交费金额
SC_Amount_Time
Date
交费时间
五.实验设计
1.概要结构设计
教师
教师特长
教师等级
教师姓名
教师号
学生
姓名
学生号
密码
课程
课程名
学时
上课周期
上课地点
课程号
招收人数
教师号
费用
账目
课程号
学生号
费用
交费时间
学生
选择
课程
教师
教学
费用
学生
姓名
学生号
密码
选择
课程
课程名
学时
上课周期
上课地点
课程号
招收人数
教师
教师特长
教师等级
教师姓名
教师号
账目
课程号
学生号
费用
教学
费用
交费时间
教师号
费用
2。逻辑结构设计
管理员表:Manager(Mno,Mname,Mpassword) 3NF
学生表:Student (Sno,Sname,Spassword) 3NF
教师表:Teacher (Tno,Tname,Tlevel,Tcharacter) 3NF
课程表:Course (Cno,Cname,Tno,Cneed_Stu,Cclass_time,Ccycle,Caddr,Camount) 3NF
Tno是参照Teacher表的外码
账目表:SC_Amount (Cno,Sno,My_Amount,SC_Amount_Time) 3NF
Cno是参照Course表的外码
Sno是参照Student表的外码
3.物理结构设计
管理员表:
CREATE TABLE Manager
(Mno Varchar(5) primary key,
Mname Varchar(20) not null,
Mpassword Varchar(20) not null
);
学生表:
CREATE TABLE Student
(Sno Varchar(5) primary key,
Sname Varchar(20) not null,
Spassword Varchar(20) not null
);
教师表:
CREATE TABLE Teacher
(Tno Varchar(5) primary key not null,
Tname Varchar(20) not null,
Tlevel Varchar(10),
Tcharacter Varchar(100)
);
课程表:
CREATE TABLE Course
(Cno Varchar(5) PRIMARY KEY not null,
Cname Varchar(20) not null,
Tno Varchar(5),
Cneed_Stu int,
Cclass_time Varchar(10),
Ccycle Varchar(10),
Caddr Varchar(20),
Camount int,
FOREIGN KEY(Tno) REFERENCES Teacher(Tno)
ON DELETE CASCADE
);
账目表:
CREATE TABLE SC_Amount
(Cno Varchar(5),
Sno Varchar(5),
FOREIGN KEY(Cno) REFERENCES Course(Cno)
ON DELETE CASCADE,
FOREIGN KEY(Sno) REFERENCES Student(Sno)
ON DELETE CASCADE,
PRIMARY KEY(Cno,Sno),
MyAmount int,
SCamount_time DATE
);
六.软件设计与实现
1.登陆与注册界面
登陆界面仿照QQ登陆界面,设计简单,一目了然,要求用户输入用户名和密码,界面下方有两个按钮,分别是“登陆”和“注册”.
输入用户名和密码后,点击“登陆”按钮时,判断用户名是否存在,若不存在,则弹出提示对话框;若存在,则判断密码是否相符;若相符,进入相应的界面;若不相符,弹出对话框提示密码错误。
点击“注册”按钮时,弹出注册界面,要求输入姓名和密码,并要求确认密码;当有未输入项时,弹出对话框提示输入;若两次输入的密码不一致,弹出对话框提示重新输入;提交成功后,弹出对话框告知学生号.
学生注册时,系统将自动生成学生号,为了防止删除时产生编号的缺失,不便于管理,系统在分配编号时,将分配给新数据当前未使用的最小编号,如:原有0201,0202,0203,0204四个学生,管理员将0203号学生信息删除后,再有新学生来注册时,系统分配给他的学生号就是0203号,而不是0205号,这样能填补之前删除的编号缺失,保证编号的连续性。
分配学生号的代码如下:
ResultSet rsno;
String b[];
rsno=sql.executeQuery("SELECT Sno FROM Student GROUP BY Sno”);
rsno.last();
n=rsno。getRow();
rsno。beforeFirst();
int k=0;
b = new String[n];
while(rsno.next())
{
b[k]=rsno.getString(1);
k++;
}
int sno=0, i;
for(i=0;i〈n;i++)
{
if(Integer。parseInt(b[i])!= 200+i+1)
{
sno=200+i+1;
break;
}
}
if(i==n)
sno=200+n+1;
登陆和注册界面如下:
2.管理员界面
登陆到管理员界面后,窗口标题为“欢迎你,管理员某某".管理员界面是一个选项卡窗格,分“添加”“删除"“查询”“更新”四个选项卡,每个选项卡上有不同的图片背景和对应功能的按钮,点击按钮时会弹出不同的功能窗口,完成各种管理活动,主界面如下:
添加时,要求输入该实体的主码作为索引,弹出一个只有一行空白区表格的窗口,输入要添加的信息后,点击“确定”按钮,即可提交,领取相应的编号,若失败,弹出对话框提示添加失败;
删除时,要求输入该实体的主码作为索引,点击“确定”按钮,在下方显示要删除的信息,再点击“删除”按钮,即可删除;若该实体不存在,则弹出对话框提示;
查询时,弹出带有表格的窗体,显示要查询的相应信息;
更新时,要求输入该实体的主码作为索引,点击“确定"按钮,在下方显示要修改的信息,再点击“修改"按钮,即可修改;修改成功弹出对话框提示,修改失败弹出对话框提示;若该实体不存在,弹出对话框提示;
由于添加、删除、修改窗体皆是通过表格组件实现的,所以界面在此处不一一举例,尽给出添加课程和查询欠费学生信息的界面:
3.学生界面
当软件检测到用户名为学生编号时,则自动进入学生登陆界面,窗口标题为“欢迎你,某某同学”.当该生有未交费或费用已到期的情况时,将弹出对话框提示,该功能是通过存储过程实现的:
create or replace procedure Warning(PCno in Varchar2,
PSno in Varchar2,
time out number)
as
PMyAmount int;
PSCamount_Time Date;
BEGIN
Select MyAmount,SCamount_Time
into PMyAmount,PSCamount_Time
From SC_Amount
Where Cno=PCno and Sno=PSno;
if PSCamount_Time IS null then
time:=30;
else
select
trunc(sysdate)-trunc(PSCamount_Time)
into time
from dual;
end if;
commit;
end;
该存储过程传入两个参数,课程号和学生号,返回一个参数,距上次交费的课程开始日期的天数,如果这个天数大于28(一般托管中心都是四周为一个月的课程),则提示“请及时交费”,存储过程调用代码如下:
CallableStatement proc = null;
for(int i=0;i<n;i++)
{
proc = con。prepareCall(”{call Warning(?,?,?)}”);
proc。setString(1, b[i]);
proc。setString(2, sno);
proc。registerOutParameter(3, Types。INTEGER);
proc。execute();
int ok = proc.getInt(3);
if(ok〉28)
{
rs=sql.executeQuery(”SELECT Cname FROM Course Where Cno='”+b[i]+"'”); rs.next();
JOptionPane。showMessageDialog(button1, ”请及时交费:”+rs。getString(1)+”课(课程号为”+b[i]+”)","交费通知”,JOptionPane。WARNING_MESSAGE);
}
}
学生登陆界面有两个菜单,分别是“查询”和“管理”,管理则有一个菜单项,“注销课程”,窗口中间有两个按钮,分别为“选择课程”和“自助交费”,点击“选择课程”,将弹出选课界面,学生主界面如下图:
选课界面:
在制作这个界面时,我真是下了不少的功夫,因为它要与数据库动态连接,前面的JCheckBox是通过查询得到的,而后面的JComboBox是根据前面的JCheckBox的值查询课程表得到的,所以过程有些复杂,一方面想要代码简单,另一方面又要考虑数据库在同一时刻有允许的最大连接数目,而通过实践发现同时对两个ResultSet进行操作就会出错,所以最终只能将查询到的科目存在数组中,再供它用。
我所采用的是盒式布局,科目是可以添加的,所以在查询科目个数之前无法确定盒子的个数,好在java能够用变量定义数组,于是我创建了一个盒子数组,终于实现如图效果。
可随之而来又产生了一个问题,随着科目的增加,窗体大小不够显示所有组件了,所以我又想到可以将这些盒子添加到一个滚动面板里,最后终于得到我想要的效果了.
还有一个小插曲,就是由于我添加了背景图片,没加入滚动面板时,图片能够显示,加入滚动面板后,图片就怎么都不显示了,即使我将滚动面板pane设为透明:
pane.setOpaque(false);
图片依然无法正确显示,后来通过上网查找解决方法,了解到要想让滚动面板透明,光设置面板透明是不够的,同时还要要设
pane。getViewport()。setOpaque(false);
滚动条也要设置成透明:
pane.getVerticalScrollBar()。setOpaque(false);
最终得到理想的效果。
部分代码如下:
JCheckBox chbox[];
JComboBox cbox[];
//查询Cname并将科目名存入JCheckBox类型的chbox数组的代码略
//通过JCheckBox类型的chbox数组中的Cname值获得相应的教师信息,并存入JComboBox类型的cbox数组中,代码如下:
ResultSet rs2;
String str[];
for(j=0;j〈n;j++)
{
rs2=sql。executeQuery(”SELECT Tno FROM Course WHERE Cname=’”+chbox[j].getText()+”' ORDER BY Tno");
rs2。last();
m=rs2。getRow();
rs2。beforeFirst();
str = new String[m];
while(rs2。next())
{
str[i]=rs2.getString(1);
i++;
}
for(int k=0;k<m;k++)
{
rs2=sql.executeQuery(”SELECT Tname FROM Teacher WHERE Tno=’”+str[k]+”'");
rs2。next();
str[k]=rs2。getString(1);
}
cbox[j] = new JComboBox(str);
m=0;
i=0;
}
七.实验总结
通过做课程设计,我学会了许多平时学不到的知识,并且动手能力的到了大大的提升。在本次课程设计中我了解到,要开发一个好的项目一定要先做好规划,按照软件的开发过程,详细地写好每一个必要的文档.软件文档的最主要目标是传达一个系统的技术要素和使用方法,第二个目标是提供软件开发过程中的需求,决策,行为,角色和责任的书面记录.
在课程设计之初,我先是构思题目的E—R图,尽量使各个实体之间的关系清晰明了,减少数据冗余,构造满足第三范式的关系.光是构思就用了三天的时间,虽然如此,当构思清晰后再动手,思路也清晰很多,编起代码来也得心应手。
通过这次课程设计,加深了我对数据库基础理论和基本知识的理解,掌握使用数据库进行软件设计的基本方法,提高运用数据库解决实际问题的能力,虽然我的程序还有很多不足,但最终实现了给定的应用要求,构造出了相对合理的数据库模式,使之能够有效地存储数据,满足了信息要求和处理要求。
9
展开阅读全文