数据库课程设计.docx
- 文档编号:24627213
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:39
- 大小:979.21KB
数据库课程设计.docx
《数据库课程设计.docx》由会员分享,可在线阅读,更多相关《数据库课程设计.docx(39页珍藏版)》请在冰豆网上搜索。
数据库课程设计
《数据库原理及应用》
课
程
设
计
报
告
一、设计目的
《数据库原理及应用》是一门实践性很强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。
本课程设计的主要目的在于:
1、加深对数据库基础理论和基本知识的理解,培养学生运用所学理论知识对数据库进行组织、管理和使用的能力。
2、掌握数据库应用系统的整个设计过程(包括需求分析、概念结构设计、逻辑结构设计与物理设计与实施),提高运用数据库解决实际问题的能力。
二、设计要求
1、要求学生熟练掌握相关数据库的基础知识,独立完成设计任务,并完成课程设计报告。
2、学生必须仔细研读数据库课程设计任务书,课程设计以学生自学为主、指导教师指导为辅。
3、本次课程设计按照教学要求需要在一周半时间内独立完成,学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时地向指导教师汇报。
4、使用工具不限,可以使用.netC#、Delphi、PB、VB等。
5、可以做成C/S或者B/S。
6、使用软件工程的思想和方法进行工程设计。
三、设计任务
学生成绩管理系统
该系统至少应包含如下功能:
1、身份验证模块
进入系统时首先进行身份验证。
只有用户名和密码正确才能进入系统。
若身
份验证时间超过20秒则停止身份验证。
2、用户管理
对使用本系统的用户进行添加、查询、修改密码、删除等操作。
3、学生信息录入
本系统能够录入学生的学号、姓名、性别、班级等信息,并且能够判断是否有不符合信息项,如有不符合的则给出提示。
4、学生成绩查询
可以根据学号、姓名、班级、学期等信息项中的一项或多项的组合,进行模糊查询和精确查询,从而高效地找到您想要的信息。
5、学生成绩更新
可以根据学号、姓名等信息项中的一项,进行模糊查询和精确查询,找到要修改的学生记录,最后是对单个记录进行逐个的修改。
也可以把录错或不再有用的信息删除掉。
6、学生成绩排序
可以按照学号、姓名、性别、班级、成绩的升序/降序(包括各科成绩、总分、平均分)来进行排序。
7、统计
可以按照课程、班级、专业等进行统计,形成报表。
学生自选课题
学生原则上可以结合个人爱好自选课题,要求自选课题必须覆盖数据库的主要内容,有一定的深度与难度,。
学生自选课题需提前报课程设计指导教师批准方可生效。
四、成绩考核
根据完成任务的情况(必须进行系统验收+答辩)、课程设计报告书的质量和课程设计过程中的工作态度等按照50%、30%、20%加权综合打分。
成绩评定实行优秀、良好、中等、及格和不及格五个等级。
五、设计报告
1、主要内容及装订顺序:
封面(封面用学校的统一封面)、目录、正文、参考文献、附录等。
2、正文部分应该包括:
需求分析、总体设计、数据库设计(含概念设计、逻辑设计、物理设计,设计报告要有ER图。
)、程序模块设计(含功能需求、用户界面设计、程序代码设计与分析、运行结果)等。
3、不交设计报告或抄袭者,按不及格论。
六、指导教师
计05:
杜献峰高艳霞
计06:
杜献峰徐飞
正文
一、需求分析:
1、身份验证模块
此程序要求允许不同级别的用户登录,级别不同,拥有的权限不同,可以进行的操作亦不同。
进入系统时首先进行身份验证。
只有用户名和密码正确才能进入系统。
若身份验证时间超过20秒则停止身份验证。
2、用户管理
对使用本系统的用户进行添加、查询、修改密码、删除等操作。
其中,管理员权限的可以执行全部操作,普通用户登录时不允许查询用户,用户添加时通过程序只能添加普通类型的用户。
3、学生信息录入
本系统能够录入学生的学号、姓名、性别、班级等信息,并且能够判断是否有不符合信息项,如有不符合的则给出提示。
4、学生成绩查询
可以根据学号、姓名、班级、学期等信息项中的一项或多项的组合,进行模糊查询和精确查询,从而高效地找到您想要的信息。
5、学生成绩更新
可以根据学号、姓名等信息项中的一项,进行模糊查询和精确查询,找到要修改的学生记录,最后是对单个记录进行逐个的修改。
也可以把录错或不再有用的信息删除掉。
6、学生成绩排序
可以按照学号、姓名、性别、班级、成绩的升序/降序(包括各科成绩、总分、平均分)来进行排序。
7、统计
可以按照课程、班级、专业等进行统计,形成报表。
二、总体设计:
系统总体框架采用Frame框架,将主frame用分隔符分成左右两部分,左半部分设置一导航(用Tree控件实现),右半部分使用Panel卡片布局,右半部分共设置了9个Panel,分别实现用户登录后的欢迎界面,用户添加界面,用户查询界面,用户修改界面,学生信息添加界面,分数查询界面,分数排序界面,分数修改添加删除界面,信息统计界面。
点击左侧的叶子节点,在右侧显示相对应的Panel。
程序另外单独添加一个OracleSQL类,在此类定义所有的需要操作数据库的函数,各个页面需要调用数据库时,只需要调用此类中的函数就可以了,这样就将界面和数据处理分开在不同的类中,是代码更易可读和修改,增加或者修改功能时只需修改SQL语句就可以了。
三、数据库设计:
此程序按照要求使用的是Oracle数据库。
程序共设计了4张表,分别是用户表,学生信息表,课程信息表,学生成绩表。
ER图设计
m
n
由ER图转化为关系:
USERMANAGER(username,password,type)
STUDENT(cno,sname,ssex,sage,sdept,sclass,sspec)
SC(cno,cname,grade,term)
在数据库中创建的表实际如下:
四:
程序模块设计、
登录模块设计:
登录窗体使用Frame,在Frame里添加两个JTable用于提示输入信息,两个编辑框用于输入用户名和密码,两个单选按钮用于选择用户登录类型,两个按钮用于确认和取消,一个JTable用于显示限制用户登录时间,效果图如下:
其中设计倒计时模块代码:
在UserLogin类中定义两个Timer类型的变量
TimersecondTime2=newTimer(1000,this);/*将定时器设定为每秒执行一次actionPerformed的方法*/
TimersecondTime=newTimer(20000,this);/*将定时器设定为每秒执行一次actionPerformed的方法*/
在UserLogin类的构造函数中启动这两个定时器变量
secondTime.start();/*定时器启动*/secondTime2.start();/*定时器启动*/
在监听其中进行监听
if(e.getSource()==secondTime){
System.exit(0);
}
elseif(e.getSource()==secondTime2){
label1.setText("登录倒数计时:
"+n--+"s");
}
用户登录验证模块:
首先连接数据库,连接上数据库后查询Usermanager表,若能查到,返回true,允许登录,调用主页面,同时计时器停止,将登录窗口隐藏。
OracleSQLoracle=newOracleSQL();
if(oracle.ConnectSQL(name,pwd,type)){
StudentSystemstudentSystem=newStudentSystem(type);
secondTime.stop();
secondTime2.stop();
this.setVisible(false);
主系统页面设计:
主页面分左右两块,左面为树控件,左边为各功能显示页面,效果图如下:
树控件模块设计:
在StudentSystem类中定义叶子节点
privateDefaultMutableTreeNodestRoot=
newDefaultMutableTreeNode(newMyNode("操作选项","0"));
privateDefaultMutableTreeNodest1=
newDefaultMutableTreeNode(newMyNode("用户管理","1"));
privateDefaultMutableTreeNodest2=
newDefaultMutableTreeNode(newMyNode("学生信息管理","2"));
privateDefaultMutableTreeNodest3=
newDefaultMutableTreeNode(newMyNode("学生成绩查询","3"));
privateDefaultMutableTreeNodest4=
newDefaultMutableTreeNode(newMyNode("更新","4"));
privateDefaultMutableTreeNodest5=
newDefaultMutableTreeNode(newMyNode("学生成绩排序","5"));
privateDefaultMutableTreeNodest6=
newDefaultMutableTreeNode(newMyNode("统计","6"));
privateDefaultMutableTreeNodest11=
newDefaultMutableTreeNode(newMyNode("用户添加","11"));
privateDefaultMutableTreeNodest12=
newDefaultMutableTreeNode(newMyNode("用户查询","12"));
privateDefaultMutableTreeNodest13=
newDefaultMutableTreeNode(newMyNode("修改密码","13"));
privateDefaultMutableTreeNodest21=
newDefaultMutableTreeNode(newMyNode("学生信息录入","21"));
privateDefaultMutableTreeNodest31=
newDefaultMutableTreeNode(newMyNode("查询成绩","31"));
privateDefaultMutableTreeNodest32=
newDefaultMutableTreeNode(newMyNode("按学号+班级查询","32"));
privateDefaultMutableTreeNodest41=
newDefaultMutableTreeNode(newMyNode("学生成绩更新","41"));
privateDefaultMutableTreeNodest51=
newDefaultMutableTreeNode(newMyNode("升序","51"));
privateDefaultMutableTreeNodest52=
newDefaultMutableTreeNode(newMyNode("降序","52"));
其中MyNode是定义的一个内部类,其构造函数publicMyNode(Stringvalues,Stringid){
this.values=values;
this.id=id;
}
通过id值可以确定单击的是哪一个节点。
构造树的时候根据登录用户的类型的不同为树添加不同的叶子节点。
以此来实现不同的用户拥有不同的功能。
构造树的函数:
publicvoidinitialTree(intlogin_id){
if(login_id==0){
st1.add(st12);
}
stRoot.add(st1);
stRoot.add(st2);
stRoot.add(st3);
stRoot.add(st4);
stRoot.add(st5);
stRoot.add(st6);
st1.add(st11);
st1.add(st13);
st2.add(st21);
st3.add(st31);
st3.add(st32);
st4.add(st41);
st5.add(st51);
st5.add(st52);
}
定义各个功能模版类的对象
publicvoidinitialPanel(){
welcome=newWelcome();
useradd=newUserAdd();
userchangePwd=newUserChangePwd();
userquery=newUserQuery();
newstudentadd=newNewStudentAdd();
gradequery=newGradeQuery();
graderank=newGradeRank();
gradeupdate=newGradeUpdate();
statistical=newStatistical();
}
初始化右半边的模版
publicvoidinitialJpy(){
jpy.setLayout(newCardLayout());
cl=(CardLayout)jpy.getLayout();
jpy.add(welcome,"welcome");
jpy.add(useradd,"useradd");
jpy.add(userchangePwd,"userchangePwd");
jpy.add(userquery,"userquery");
jpy.add(newstudentadd,"newstudentadd");
jpy.add(gradequery,"gradequery");
jpy.add(graderank,"graderank");
jpy.add(gradeupdate,"gradeupdate");
jpy.add(statistical,"statistical");
}
在监听函数中根据不同的节点响应对应的面板
publicvoidaddListener(){
jt.addMouseListener(
newMouseAdapter(){
publicvoidmouseClicked(MouseEvente){
DefaultMutableTreeNodedmtntemp=
(DefaultMutableTreeNode)jt.getLastSelectedPathComponent();
MyNodemynode=(MyNode)dmtntemp.getUserObject();
Stringid=mynode.getId();
if(id.equals("0")){
cl.show(jpy,"welcome");
System.out.println("欢迎页面");
}
elseif(id.equals("11")){
cl.show(jpy,"useradd");
}
elseif(id.equals("12")){
cl.show(jpy,"userquery");
//userquery.setVisible(true);
}
elseif(id.equals("13")){
cl.show(jpy,"userchangePwd");
//userchangePwd.setVisible(true);
userchangePwd.setFocus();
}
elseif(id.equals("21")){
cl.show(jpy,"newstudentadd");
}
elseif(id.equals("31")){
//gradequery.setVisible(true);
cl.show(jpy,"gradequery");
}
elseif(id.equals("41")){
//gradeupdate.setVisible(true);
cl.show(jpy,"gradeupdate");
}
elseif(id.equals("51")){
//graderank.setVisible(true);
cl.show(jpy,"graderank");
}
elseif(id.equals("6")){
//graderank.setVisible(true);
cl.show(jpy,"statistical");
}
}
}
);
jt.setToggleClickCount
(1);//将展开节点的鼠标点击次数设置为1
}
设计操作数据库类:
对数据库的连接,数据的查询,更新函数都写在这一个类中。
连接数据库函数:
连接成功则返回true,否则返回false;
publicbooleanConnectSQL(){//连接数据库
if(stmt!
=null){
try{
stmt.close();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
if(conn!
=null){
try{
conn.close();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
try{
/**使用Class.forName()方法自动创建这个驱动程序的实例且自动调用DriverManager来注册它*/
Class.forName(DB_DRIVER).newInstance();
//与url指定的数据源建立连接
conn=DriverManager.getConnection(DB_URL,DB_User,DB_Pwd);
//采用Statement进行查询
stmt=conn.createStatement();
System.out.println("连接成功");
returntrue;
}catch(Exceptione){
e.printStackTrace();
returnfalse;
}
}
验证用户登录函数:
//验证用户登录
publicbooleanConnectSQL(Stringusername,Stringuserpassword,intusertype)throwsSQLException{
Stringsql="select*fromUSERMANAGERwhere"+
"USERNAME='"+username+"'andPASSWORD='"+userpassword+"'andTYPE='"+usertype+"'";
if(ConnectSQL()){
//System.out.println("连接成功");
returnexecute(sql);
}
else
returnfalse;
}
//执行查询验证登陆
publicbooleanexecute(Stringsql)throwsSQLException{
booleanis_login=false;
try{
rs=stmt.executeQuery(sql);
}catch(SQLExceptione){
e.printStackTrace();
}
if(rs.next())
is_login=true;
rs.close();
close();
returnis_login;
}
数据查询函数,其中把查询到的数据用Vector保存。
publicbooleanexecuteQuery(Stringsql)throwsSQLException{//数据查询
if(!
ConnectSQL())
returnfalse;
rs=null;
columnHeads=newVector();
Rows=newVector();
try{
rs=stmt.executeQuery(sql);
}catch(SQLExceptione){
e.printStackTrace();
returnfalse;
}
if(!
rs.next()){
rs.close();
close();
returnfalse;
}
try{
ResultSetMetaDatarsmd=rs.getMetaData();
for(inti=1;i<=rsmd.getColumnCount();i++)
columnHeads.addElement(rsmd.getColumnName(i));//得到列的头
do{
Rows.addElement(getNextRow(rs,rsmd));
}while(rs.next());
rs.close();
returntrue;
}catch(SQLExceptione){
e.printStackTrace();
returnfalse;
}
//returntrue;
}
privateVectorgetNextRow(ResultSetrs,ResultSetM
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 课程设计