数据库课程设计之学生信息管理系统.docx
《数据库课程设计之学生信息管理系统.docx》由会员分享,可在线阅读,更多相关《数据库课程设计之学生信息管理系统.docx(30页珍藏版)》请在冰豆网上搜索。
![数据库课程设计之学生信息管理系统.docx](https://file1.bdocx.com/fileroot1/2023-2/28/0648f479-3a80-4eca-8df3-cc3fad92e45a/0648f479-3a80-4eca-8df3-cc3fad92e45a1.gif)
数据库课程设计之学生信息管理系统
数据库原理课程设计报告
题目:
学生信息管理系统
学生姓名:
穆岭(徐清锋、冉丽华)
学号:
0908060070
班级:
计科092
院系:
计算机科学与信息学院
专业年级:
计算机科学与技术 2009级
2011年12月22日
一、需求分析
需包含内容为:
(1)问题描述:
学生信息的管理是学校很重要的一项工作,而人工管理学
生信息的话,无疑是一个很费时费力的事情,而且效率不高,容易出错,往往
是学校进行学生工作的一个瓶颈问题,有一个学生信息管理的系统就能够帮助
学校更好完成学生信息管理的工作,降低管理成本。
所以我们组编写了一个学
生信息管理系统,使其在学生管理工作中发挥更大的作用。
(2)系统功能描述:
本系统是一个学生信息管理系统,主要管理学生的基本信息,课程信息,
以及学生选课成绩信息等,登录的模块有两种登录类型,分别是管理员登录和
学生登录,如果是管理员登录的话,进入管理员界面,要求管理员界面中可以
信息的学生基本信息、课程基本信息和学生选课成绩信息的管理设置;还有信
息查询,在这块儿中可以进行学生基本信息的查询,课程信息的查询,以及选
课成绩信息的查询;除此之外,要求设一个用户维护模块,在这个模块中管理
员可以添加管理员用户或者是学生用户,可以修改密码,并且能够切换用户登
录;接着是帮助,帮助中显示系统的版本;最后要求有一个推出系统按钮。
如
果是学生登录,那么学生可以进行学生信息的维护,可以进行登录密码的修改,
基本信息的修改,以及切换用户登录;可以进行学生基本信息的查询,学生课
程学习的查询,学生选课成绩信息的查询。
接着是帮助,帮助中显示系统的版
本;最后要求有一个推出系统按钮。
其详细的操作框架流程在下面的图中可以
见到。
操作流程框图:
存储的数据信息:
User 表(用户名,密码,用户类型标识),用于存储登录用户信息;
Student 表(学号,姓名,性别,出生日期,电话,QQ 号,专业,班级,家庭地
址),用于存储学生基本信息;
Course 表(课程号,课程名,先行课,学分,教师姓名),用于存储课程基本信
息;
SC 表(学号,课程号,成绩,绩点),用于存储学生选课成绩信息。
(3)有何安全性与完整性方面的要求。
安全性:
如果是管理员登录系统:
可以进行管理设置,包括(设置学生的
基本信息、设置课程信息、设置学生成绩信息),设置各种信息的时候有添加,
删除和修改等相应功能,然后是信息查询,包括(查询学生基本信息,查询课
程信息、查询学生成绩信息),用户的维护,包括(添加用户,修改用户密码,
切换用户登录),帮助,退出系统。
如果是学生登录系统:
可以修改自己的基本
信息,修改个人登录密码,切换用户登录,同样可进行信息查询,包括(查询
学生基本信息,查询课程信息、查询学生成绩信息),查看帮助,退出系统。
完整性:
主要是在删除学生信息和课程信息的时候如果在选课信息中存在
选课成绩信息的话,那么就不能直接进行相应信息的删除,在开发中要给出相
应的信息提示,在进行各种添加、和更新操作之前也有进行相应的判断,如果
原来的信息中已经有了所要添加的该条信息,怎不能添添加,并给出相应的提
示,如果不存在所要更新的信息的时候也不能进行更新,并给出相应的提示。
具体的完整性约束在编程中具体给出。
二、概念结构设计
画出系统整体的 E-R 模型;并对模型中所出现的实体及属性等信息加以说
明。
概念模型
物理模型
属性名
存储代码
类型
长度
是否可为空
主键否
备注
学号
sno
VARCHAR
20
否
是
学生学号
姓名
sname
VARCHAR
20
否
学生姓名
性别
sex
VARCHAR
2
否
性别
出生日期
birth
DATE
出生日期
电话
tel
VARCHAR
20
联系电话
QQ 号
qq
VARCHAR
20
QQ 号码
专业
sdept
VARCHAR
20
否
学生所在专业
属性名
存储代码
类型
长度
是否可为空
主键否
备注
用户名
uname
VARCHAR
20
否
是
用户登录名
密码
upass
VARCHAR
30
否
用户登录密码
用户类型
标识
bs
INT
否
用于标识是管理员
还是学生
表
三、逻辑结构设计
(1)模式设计:
按系统整体 E-R 模型,写出关系模式;并利用数据字典加
以描述。
(如每个关系模式有何属性、属性的类型、属性值的长度、是否可取空
值、是否为主码、有何约束条件等信息);
本系统的设计中主要涉及到四个表,分别是 User 表、Student 表,Course
表,SC 表,在这四个表中,User 表用于存储用户信息,Student 表存储学生信
息表,Course 表存储课程信息,SC 表存储学生选课的成绩信息。
这四个表的结
构如下:
User 表
Student
属性名
存储代码
类型
长度
是否可为空
主键否
备注
学号
sno
VARCHAR
20
否
是
学生学号
姓名
sname
VARCHAR
20
否
学生姓名
课程号
cno
VARCHAR
20
否
是
课程编号
课程名
cname
VARCHAR
20
否
课程名
学分
credit
FLOAT
学分
成绩
grade
FLOAT
成绩
绩点
point
FLOAT
绩点
联系电话
tel
VARCHAR
20
联系电话
属性名
存储代码
类型
长度
是否可为空
主键否
备注
课程号
cno
VARCHAR
20
否
是
课程编号
课程名
cname
VARCHAR
20
否
课程名
先行课
cpno
VARCHAR
20
先行课程
学分
credit
FLOAT
否
学分
教师姓名
tname
VARCHAR
20
否
教师姓名
属性名
存储代码
类型
长度
是否可为空
主键否
备注
学号
sno
VARCHAR
20
否
是
学号
课程号
cno
VARCHAR
20
否
是
课程编号
成绩
grade
FLOAT
课程成绩
绩点
point
FLOAT
课程绩点
班级
class
VARCHAR
20
否
所在班级
家庭地址
address
VARCHAR
50
学生家庭地址
Course 表
SC 表
(2)子模式设计:
即针对自己的设计模块的应用需定义什么样的视图表结
构;并利用数据字典加以描述。
由于在查询学生成绩信息的时候要查询学生学号、姓名、课程号、课程名、
学分、成绩、绩点、联系电话,这就需要涉及到三个表的连接,为了查询的方
便,所以在进行设计的时候创建了一个 Stu_Cou_SC 视图表,表结构为
Stu_Cou_SC 视图(学号,姓名,课程号,课程名,学分,成绩,绩点,联系电话)
Stu_Cou_SC
(3)画出系统功能模块图,并对各功能模块进行简单介绍。
在登录模块中,设置了两种登录类型,一种是管理员登录,一种是学生登
录。
这两种登录有着不同的使用权限。
管理员登录系统可以进行管理设置,信
息查询和用户维护等操作,学生登录系统可以进行信息维护和信息查询等。
在管理设置模块中,用户可以进行学生信息的设置、课程信息设置、选
课成绩信息的设置,在各个信息的设置中都可以进行添加、更新和删除操
作。
在信息查询模块中,用户可以进行学生基本信息查询,课程信息查询以及学生选课成
绩信息的查询。
在各个查询中又设置有精确查询和模糊查询,使其查询更智能化。
在用户维护模块中,可以进行添加用户,修改用户登录密码,切换用户登录功能。
在学生登录后的信息维护模块中,学生统一可以修改登录密码,修改个人
基本信息,和切换用户登录。
四、数据库的物理设计
在本系统的数据库设计阶段,我们为其建立了下面的三个索引字段,分别
是基于Student表建立的Stusno以sno为升序索引,基于Course表建立的Coucno
以cno为升序索引,和基于SC表建立的SCno以sno为升序,以cno为降序的索引。
对应的T-SQL语句如下:
/*创建索引字段*/
DROP INDEX Student.Stusno;
CREATE INDEX Stusno ON Student(sno ASC);
DROP INDEX Course.Coucno;
CREATE INDEX Coucno ON Course(cno ASC);
DROP INDEX SC.SCno;
CREATE INDEX SCno ON SC(sno ASC,cno DESC);
五、数据库设计实现及运行
(1)数据库的创建
T-SQL 语句:
CREATE DATABASE SIMS;
(2)数据表的创建
T-SQL 语句:
/*用户表*/
DROP TABLE User;
CREATE TABLE User(
unameVARCHAR(20) NOT NULL,
upassVARCHAR(30) NOT NULL,
bsINTNOT NULL
);
/*学生表*/
DROP TABLE Student;
CREATE TABLE Student(
snoVARCHAR(20)PRIMARY KEY,
snameVARCHAR(20)NOT NULL,
sexVARCHAR
(2)NOT NULL,
birthDATE,
telVARCHAR(20),
qqVARCHAR(20),
sdeptVARCHAR(20)NOT NULL,
classVARCHAR(20)NOT NULL,
addressVARCHAR(50)
);
/*课程表*/
DROP TABLE Course;
CREATE TABLE Course(
cnoVARCHAR(20) PRIMARY KEY,
cnameVARCHAR(20) NOT NULL,
cpnoVARCHAR(20) ,
credit FLOAT NOT NULL,
tnameVARCHAR(20) NOT NULL
);
/*成绩表*/
DROP TABLE SC;
CREATE TABLE SC(
snoVARCHAR(20),
cnoVARCHAR(20),
gradeFLOAT,
pointFLOAT,
PRIMARY KEY(sno,cno),
Foreign KEY (sno) REFERENCES Student(sno),
Foreign KEY (cno) REFERENCES Course(cno)
);
(3)视图的创建
T-SQL 语句:
/*创建Stu_Cou_SC视图*/
DROP VIEW Stu_Cou_SC;
CREATE VIEW
Stu_Cou_SC(sno,sname,cno,cname,credit,grade,point,tel)
AS
SELECT s.sno,sname,o,cname,credit,grade,point,tel
FROM Student s,Course c,SC sc
WHERE s.sno=sc.sno AND o=o;
(4)各模块中的功能实现
a)功能界面(截图);
管理员登录模块功能截图
用户登录
添加学生信息
更新学生信息
删除学生信息
信息查询
查询学信息
精确查询
模糊查询
用户维护
添加用户
修改密码
帮助
切换用户登录
弹出登录窗体选择学生登录
学生登录功能截图
信息维护
信息查询
b)功能界面简单描述;
首先是运行程序,进入用户登录界面,登录是要进行身份验证,在这
登录过程系统会通过数据库中的 User 表存储的数据进行验证,并判断用标
识检查登录的类型。
当登录的类型是管理员登录时,登录成功后会进入管理员操作界面,
在管理员登录界面中,管理员可以进行管理设置,如:
设置学生基本信息,
设置课程信息,设置成绩信息,每个设置都有相应的添加、更新、删除操
作;接着是信息查询,在这儿可以查询学生的基本信息,查询课程信息,
查询成绩信息,在每一种查询中都分别设置有精确查询和模糊查询等操作,
模糊查询使得查询在查询的时候更加方便;还有就是用户维护操作,这里
面管理员可以添加用户,修改登录密码,切换用户登录,最后是帮助中的
关于和系统的退出。
当登录类型为学生登录时,登录成功后会进入学生操作界面,在此界
面中学生可以在信息维护下修改登录密码,更新个人基本信息,切换用户
登录;然后也可以查询学生基本信息,查询课程信息,查询成绩信息,同
样查询中也设置有精确查询和模糊查询;最后也有帮助中的关于和系统的
退出。
在界面的操作过程中,对一些在操作中可能是操作失误导致的错误进
行了相应的提示,比如成绩的输入必须是字符型数字,出生日期是格式应
为 yyyy-MM-dd 格式,如果输入格式不对,给出相应的提示,操作人员在给
出对应的正确操作,这使得该系统变得更加智能化。
c)T-SQL 语句与宿主语言嵌套使用代码段
/*JAVA数据库的连接程序*/
private static final String DBDRIVER =
com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String DBURL = "jdbc:
sqlserver:
//localhost:
1433;"
+ "DatabaseName=SIMS ";
private static final String DBUSER = "sa";
private static final String DBPASS = "";//密码为空
private Connection conn = null;
public DatabaseConnection() {
try {
Class.forName(DBDRIVER);
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
try {
conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
}
public Connection getConnection() {
return this.conn;
}
public void close() {
if (this.conn !
= null) {
try {
this.conn.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
}
}
/*添加用户登录查询块*/
dbconn = new DatabaseConnection(); // 初始化连接类
conn = dbconn.getConnection(); // 获得连接
String sql = "SELECT uname,upass,bs FROM [User] WHERE uname=?
AND bs=?
";
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, getName());
pstmt.setInt(2, user.getBs());
ResultSet rs = pstmt.executeQuery();
user.setUname(null);
user.setUpass(null);
user.setBs
(2);
while (rs.next()) {
user.setUname(rs.getString
(1));
user.setUpass(rs.getString
(2));
user.setBs(rs.getInt(3));
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, e.getMessage());
} finally {
if (conn !
= null) {
dbconn.close();
}
}
/*添加登录用户信息*/
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql1 = "SELECT * FROM [User] WHERE uname=?
AND bs=?
";;
try {
pstmt = conn.prepareStatement(sql1);
pstmt.setString(1, username);
pstmt.setInt(2, user.getBs());
rs = pstmt.executeQuery();
if(!
rs.next()){
String sql3 = "INSERT INTO [User](uname,upass,bs) VALUES(?
?
?
) ";
int i=0;
pstmt = conn.prepareStatement(sql3);
pstmt.setString(1, username);
pstmt.setString(2, pass1);
pstmt.setInt(3,user.getBs());
i = pstmt.executeUpdate();
if(i>0){
JOptionPane.showMessageDialog(this, "用户添加成功");
jTextField1.setText(null);
jPasswordField1.setText(null);
jPasswordField2.setText(null);
jRadioButton1.setSelected(false);
jRadioButton2.setSelected(false);
this.setVisible(false);
}else{
JOptionPane.showMessageDialog(this, "用户添加失败");
}
}else{ // 在数据表中找到了改用户
JOptionPane.showMessageDialog(this, "对不起,该用户名已经存在,请
使用其他用户名!
");
this.jPasswordField1.setText(null);
this.jPasswordField2.setText(null);
}
} catch (SQLException e1) {
JOptionPane.showMessageDialog(this, "用户添加失败,数据库操作异常:
"+e1.getMessage());
} finally {
if (conn !
= null) {
dbconn.close();
}
}
/*修改用户登录密码*/
String sql1 = "SELECT * FROM [User] WHERE uname=?
AND upass=?
";
try {
pstmt = conn.prepareStatement(sql1);
pstmt.setString(1, uname);
pstmt.setString(2, passtr);
rs = pstmt.executeQuery();
if(!
rs.next()){
JOptionPane.showMessageDialog(this, "密码修改失败,输入的旧密码不正!
");
}else{
String sql2 = "Update [User] SET upass=?
WHERE uname=?
AND upass=?
int i=0;
pstmt = conn.prepareStatement(sql2);
pstmt.setString(1, pass1);
pstmt.setString(2, uname);
pstmt.setString(3, passtr);
i = pstmt.executeUpdate();
if(i>0){
JOptionPane.showMessageDialog(this, "密码修改成功");
jPasswordField1.setText(null);
jPasswordField2.setText(null);
jPasswordField3.setText(null);
this.setVisible(false);
}else{
JOptionPane.showMessageDialog(this, "密码修改失败");
}
}
} catch (SQLException e1) {
JOptionPane.showMessageDialog(this, "密码修改失败,数据库操作异常:
"+e1.getMessage());
} finally {
if (conn !
= null) {
dbconn.close();
}
}
/*添加学生基本信息块*/
String sql1 = "SELECT * FROM Student WHERE sno=?
";
ResultSet rs=null;
try {
PreparedStatement pstmt = null;
pstmt = conn.prepareStatement(sql1);
pstmt.setString(1, stu.getSno());
rs = pstmt.executeQuery();
} catch (SQLException e) {
JOptionPane.showMessageDialog(this,"查询时发生异常为:
"+e.getMessage());
}
try{
if (rs.next()) {
JOp