资源描述
数据库课程设计报告
-------学生信息管理系统
第 31 页
一、系统开发平台
1.1 题目:学生选课管理信息系统
n (1) 要求系统可以准确地记录和查询学生信息,包括学生的姓名、单位、年龄、性别以及身份证号码等。
n (2) 要求系统可以准确地记录学生地每一次奖惩情况。
n (3) 系统可以对学校的院系情况进行管理,包括设置学院名称、修改某学院某专业方向的名称等。
n (4) 系统应该可以对基础数据进行维护。
n (5)系统能够对开设的课程进行管理
n (6)学生选课管理、考试(登记分数)
n (7)系统还应该提供强大数据统计、查询、报表生成以及打印等功能。
n (8)用户权限管理
n (9)异常处理
1.2 开发语言:Java
用Java做设计流程清晰、结构合理,有良好的可扩充性和耦合性。
1.3 开发工具:Eclipse
1.4 数据库: MySQL
1.5 操作系统:Microsoft Windows 8.1
二、数据库规划
2.1 任务陈述
n (1) 要求系统可以准确地记录和查询学生信息,包括学生的姓名、单位、年龄、性别以及身份证号码等。
n (2) 要求系统可以准确地记录学生地每一次奖惩情况。
n (3) 系统可以对学校的院系情况进行管理,包括设置学院名称、修改某学院某专业方向的名称等。
n (4) 系统应该可以对基础数据进行维护。
n (5)系统能够对开设的课程进行管理
n (6)学生选课管理、考试(登记分数)
n (7)系统还应该提供强大数据统计、查询、报表生成以及打印等功能。
n (8)用户权限管理
n (9)异常处理
2.2 任务目标
本系统主要可以实现以下任务目标:
1、系统可以准确地记录和查询学生信息,包括学生的姓名、专业、生日、性别以及身份证号码等,可以准确地记录学生的每一次奖惩情况。
2、系统可以对学校的院系情况进行管理,包括添加查询修改删除学院信息、添加查询修改删除某学院某专业信息等。
3、系统可以准确地记录和查询教师信息,包括教师的姓名、专业、生日、性别以及身份证号码等。
4、系统可以对开设的课程进行管理,包括课程信息的查询、添加、修改和删除,选课阶段、已开课、统计成绩、公布成绩三种状态。
5、系统可以对基础数据进行维护。
6、学生选课管理,学生只可以注销在选课阶段的课程,处于已开课、统计成绩、公布成绩的课程不可以注销。
7、系统可以提供强大数据统计、查询、报表生成以及打印等功能。
8、用户权限管理:本系统一共设置了三种用户身份,分别是管理员用户、教师用户和学生用户。
院系管理员可以管理增改删查所有学院情况、课程、老师、学生情况,修改密码
教师用户拥有修改、查看那自己所授课程和录入成绩的权限,修改密码
学生用户则拥有查询学籍信息、查询课程信息、选课、注销选课和查询成绩信息的权限。
9、异常处理。
三、系统定义
3.1 系统边界
系统边界描述数据库系统和企业信息系统的其他部分的接口,是信息系统内部构成元素及外部有联系实体之间的信息关系的描述及分割。它并不需要在它们之间划一条物理边界,而只需要弄清它们之间信息输入及输出的分割。
本数据库系统共包括学生信息、教师信息、课程信息、学院及专业信息、选课信息、授课信息及成绩信息八个模块。该信息系统的其他部分包括学生专业选择、教师配置、学生选课、学院设置、课程要求、具体教学等。
数据库系统的内部构成元素及外部其他部分之间的信息关系如下图所示:
从属于
学院信息
管理员
方向信息
增改删查
书于
包含于
工作于
课程信息
选修
教授课程
老师信息信息
增改删查
增改删查
教师
学生
学生信息
3.2 用户视图
3.2.1 学生(Student)用户视图
(1) 修改个人信息。
(2) 按课程名、课程号、专业、学分等信息查询课程,选课和查询已选课程。
(3) 注销选课(只能注销选课阶段的课程,已公布成绩的课程不可注销)。
(4) 成绩查询(教师公布成绩后学生方可查看到自己的成绩)。
3.2.2 教师(Teacher)用户视图
(1) 修改个人信息。
(2) 修改所授课程的信息(一名教师可教授多门课程)。
(3) 录入、查看成绩(录入成绩的课程状态为“统计成绩” ,成绩录入的权限只有教师用户有)。
(4) 公布成绩(公布成绩后学生方可查看到自己的成绩)。
(5) 备选功能:自动计算所授课程的选课人数、有成绩人数、平均成绩,且按成绩由高到低排序。查看所授课程选课情况。教师可以自主选课(教师所在学院方向的课程)。
3.2.3 学院管理员(Administrator)用户视图
(1) 学生管理:
查询、添加、修改、删除学生信息,添加学生奖惩信息
(2) 教师管理:
查询、添加、修改、删除教师信息。
(3) 课程管理:
查询、添加、修改、删除课程信息。
(4) 选课管理:
查询选课信息,添加选课信息(修改选课信息权限只有学生用户有),修改选课状态(选课阶段、已开课、统计成绩、公布成绩、结束)。
(5) 授课管理:
查询、添加、修改、删除授课信息。
(6) 专业管理:
查询、添加、修改、删除专业信息。
(7) 学院管理:
查询、添加、修改、删除学院信息。
(8) 管理员操作:
查询、添加、修改、删除学院管理员信息。
(9) 修改个人信息。
3.2.4 数据库系统多用户视图
管理员
教师
学生
四、需求分析
此学生管理信息系统的主要功能如下图所示:
学生用户:修改个人信息、课程查询、选课、注销选课、成绩查询
教师用户:修改个人信息、修改所授课程信息、查看学生选课信息、成绩录入
管理员用户:学生管理、教师管理、课程管理、专业管理、学员管理、管理员操作
4.1 用户需求说明
4.1.1 数据需求
其中需求数据为:
1、 学生基本信息记录:
用户名、姓名、身份证号、方向、性别、生日、密码、奖惩信息
2、 教师基本信息记录:
用户名、姓名、身份证号、方向、性别、生日、密码
3、 管理员基本信息记录:
用户名、密码、姓名、权限等级
5、课程基本信息记录:
课程号、课程名、所属方向、学分
6、学院及专业基本信息记录:
学院:学院名称,学院号
方向:方向名称、所属学院
7、选课信息管理:
选课:学生用户选定课程的课程号、课程名、开课专业、学分、详细信息
注销选课:学生用户注销选课的课程号、课程名、任课教师、学分、课程状态(只能注销状态为选课阶段的课程)
8、授课信息管理:
课程号、课程名、教师号、教师姓名、选课人数
9、成绩信息管理:
学生查看:课程号、课程名、任课教师、学分、状态、成绩
教师录入:所授课程、学号、成绩
教师查看:名次、学号、姓名、学院、专业、班级、成绩
4.1.2 事务需求
1、 数据录入:
(1) 录入学生的基本信息:
学号、姓名、所属专业、性别、生日、身份证号
(2) 录入学生的选课信息
(3) 录入教师的基本信息:
学工号、姓名、院系、性别、生日、身份证号、研究方向
(4) 教师录入学生的成绩信息:
选择所授课程后,录入学号、成绩
(5) 录入课程的基本信息:
课程号、课程名、开课专业、学分
(6) 录入授课信息:
课程号、教师号
(7) 录入专业信息:
专业名、所属学院
(8) 录入学院信息:
学院名、地址
(9) 录入学院管理员的基本信息:
管理员号、管理员姓名
(10) 录入超级管理员的基本信息
管理员号、管理员姓名
2、 数据更新/删除:
(1) 学生个人信息的更新
(2) 学生注销选课信息
(3) 教师个人信息的更新
(4) 教师所授课程信息的更新
(5) 教师录入成绩的更新/ 删除
(6) 学生基本信息的更新/ 删除(管理员操作)
(7) 教师基本信息的更新/ 删除(管理员操作)
(8) 课程基本信息的更新/ 删除(管理员操作)
(9) 选课状态的更新:分为选课阶段、已开课、统计成绩、公布成绩、结束(管理员操作)
(11) 授课信息的更新(管理员操作)
(12) 专业基本信息的更新/ 删除(管理员操作)
(13) 学院基本信息的更新/ 删除(管理员操作)
(14) 管理员个人信息的更新(管理员操作)
数据查看:
学生用户视图下:
(1) 列出学生基本信息
(2) 按照课程号列出课程的课程号、课程名、开课专业、学分
教师用户视图下:
(1) 列出教师基本信息
(2) 列出所授课程的基本信息
(3) 列出所授课程的学生选课信息:学号、姓名、所属专业、性别、生日、身份证号
管理员用户视图下:
(1) 按照学号列出学生的学号、姓名、所属专业、性别、生日、身份证号
(2) 按照学工号列出教师的学工号、姓名、院系、性别、生日、身份证号、研究方向
(3) 按照课程号列出课程的课程号、课程名、开课专业、学分
(4)按照课程号列出选课信息:课程号、课程名、学号、学生姓名、教师号、教师姓名、状态、成绩
(5)按照学生学号列出选课信息:课程号、课程名、学号、学生姓名、教师号、教师姓名、状态、成绩
(6)按照教师学工号列出选课信息:课程号、课程名、学号、学生姓名、教师号、教师姓名、状态、成绩
(7)按照课程号列出授课信息:课程号、课程名、教师号、教师姓名、选课人数
(8)按照课程名列出授课信息:课程号、课程名、教师号、教师姓名、选课人数
(9)按照教师学工号列出授课信息:课程号、课程名、教师号、教师姓名、选课人数
(10)按照学院管理员号列出学院管理员的管理员号、姓名
(11)按照超级管理员号列出超级管理员的管理员号、姓名
4.2 系统需求说明
该学生选课管理信息系统需要较强的数据处理功能,理论上应该能够容纳上万人的数据资料,并且在搜索方面理应具有较快的响应速度,能够处理多方面的数据请求。权限设置清晰明了,能够有效的防止越权操作。系统能够有效的处理各种异常,具有较好的健壮性。
4.2.1 初始数据库大小
(1) 大约有10门课程,分属于约4个学院中,每个学院有10个以下的专业。
(2) 大约有20名学生分布在各个学院,每个学院平均有2名学生。
(3) 大约有20名教师分布在各个学院,每个学院平均有2名教师。
(4) 大约有10名管理员分布在各个学院,每个学院平均有1名学院管理员。
(5) 每名学生一学期平均选择2门课程。
(6) 每名教师平均所授课程为2门。
4.2.2 网络和共享 需求
(1) 所有学院必须安全的和总部中央数据库网络互连
(2) 必须能够支持每个学院至少300名用户同时访问,需要考虑这么大数量并发访问的许可需求。
性能:
4.2.3 性能
高峰期:每年的1月、3月、6月、9月
(1) 单个记录查询时间少于1秒,高峰期少于5秒
(2) 多个记录查询时间少于5秒,高峰期少于10秒
(3) 更新/保存记录时间少于1秒,高峰期少于5秒
4.2.4 安全性
(1) 数据库必须有口令保护
(2) 每个用户分配特定的用户视图所应有的访问权限
(3) 用户只能在适合他们完成工作需要的窗口中看到需要的数据
4.2.5 备份和恢复
每天24点备份
4.2.6 用户界面
菜单驱动,联机帮助
4.2.7 法律问题
对用户信息管理,遵守法律
五、数据库逻辑设计
5.1 ER图【3】:
本系统的ER图如下:
实体: 联系: 属性:
课程
教师
学生
学院
专业
授课
选课
工作于
属于
包含
password
name
credit
Tid
name
name
identity
direction
sex
Sid
password
Cid
identity
birth
name
birth
Deptid
sex
name
state
score
direction
Did
m m
n n
m m
[3] Abraham Silberschatz,Henry F.Korth,《数据库系统概念》,机械工业出版社,2008。
1 1
1 m
该ER图包括课程、教师、学生、学院、专业五个实体和授课、选课、工作于、属于、包含五个联系。
5.2 数据字典
5.2.1 从数据字典中抽取出来的系统实体描述:
实体
属性
描述
数据类型
和长度
主键
是否允许
空值
学院管理员
Admin_id
管理员用户名
Varchar
32
Admin_id
否
Password
密码
Varchar
32
否
Name
姓名
Varchar
32
否
Dept
所属学院
Varchar
32
否
Regist_date
注册日期
Varchar
32
是
学生
Sid
学生用户名
Varchar
32
Sid
否
Password
密码
Varchar
32
否
Name
姓名
Varchar
32
否
Dept
学院
Varchar
32
否
Major
专业
Varchar
32
否
Sex
性别
Varchar
32
否
Birth
生日
Varchar
32
否
Identity
身份证号
Varchar
32
否
教师
Tid
教师用户名
Varchar
32
Tid
否
Password
密码
Varchar
32
否
Name
姓名
Varchar
32
否
Dept
学院
Varchar
32
否
Direction
研究方向
Varchar
32
是
Sex
性别
Varchar
32
否
Birth
生日
Varchar
32
否
Identitiy
身份证号
Varchar
32
否
课程
Cid
课程号
Varchar
32
Cid
否
Name
课程名
Varchar
32
否
Parent_major
所属专业
Varchar
32
否
Credit
学分
Float
8
否
学院
Name
学院名称
Varchar
32
Deptid
否
Deptid
学院号
Varchar
32
是
课程状态
ID
状态号
Varchar
32
ID
否
State
状态
Varchar
32
否
专业
Name
专业名称
Varchar
32
Did
否
Did
专业号
Varchar
32
否
Parent_college
所属学院
Varchar
32
否
荣誉
R_id
荣誉号
Varchar
32
Did
否
Reward
荣誉
Varchar
32
否
5.2.2 从数据字典中抽取出来的联系的描述:
实体
多样性
联系
多样性
实体
教师
m
授课
n
课程
学生
m
选课
n
课程
教师
m
工作于
1
学院
学生
m
属于
1
专业
学院
1
包含
m
专业
5.3 关系表
该数据库关系图如下:
其中包含的联系有:
实体
联系
实体
教师
授课
课程
学生
选课
课程
教师
工作于
学院
学生
属于
专业
学院
包含
专业
学生
拥有
荣誉
课程
拥有
状态
六、数据库物理设计
6.1 安全机制
6.1.1 系统安全
1、提供了充足的异常处理机制,能够捕获由各种错误引发的异常(如:越权操作、输入数据类型及数据库要求类型不一致、查询过程中出现的错误等等)。
2、系统登录时要凭用户名和口令进入,输入正确时才可以进入系统。用户需要选择自己的身份(学生、教师、管理员),若用户名和密码输入正确,系统可以打开符合该用户身份的操作界面。其他界面该用户没有权限访问。
6.1.2 数据安全
1、根据用户身份,用户进入不同的用户界面,即享有不同的权限,只有管理员才可以实现修改一些重要信息,以确保数据库不被随意更改,保证数据安全。
2、该学生系统共有三种身份:学生、教师、管理员。他们相应的权限如下:
(1)学生:查看修改个人信息、查看课程信息、选课/注销选课(只有在选课阶段的课程才可以注销)、查看自己所选课程成绩(教师公布成绩后学生方可查看到自己的成绩)。
(2)教师:查看修改个人信息、查看修改所授课程信息(一名教师可教授多门课程)、查看所授课程的学生选课情况、成绩录入(录入成绩的课程状态为“统计成绩” ,成绩录入的权限只有教师用户有)、公布成绩(公布成绩后学生方可查看到自己的成绩)。
(3)管理员:添加删除修改查看学生信息、添加删除修改查看教师信息、添加删除修改查看课程信息、添加删除修改查看学院信息、添加删除修改查看专业信息、添加查看选课信息(修改选课信息权限只有学生用户有)、修改课程状态、添加修改查看授课信息、添加删除修改查看其他管理员信息、查看修改个人信息。
6.2 其他
规范化产生一个结构上一致且最小冗余的逻辑数据库设计,但是,规范化的数据库设计有时不能提供最大的处理效率。所以我们愿意接收规范化设计方面的一些损失而实现更好的性能。在该系统中,表“学生”中复制了表“专业”的“所属学院”一列,加快了检索速度,方便通过列“学院”来查询特定学院的学生,也方便形成某学院的视图。
七、应用程序设计
7.1 功能模块
该学生管理信息系统共有三个角色:学生、教师、管理员
7.2 界面设计
登录界面
7.3 代码设计
连接数据库:
String url="jdbc:mysql://localhost:3306/dbsml?"
+ "user=dbsml & password=28129";
Connection con;
String sql;
Statement stmt;
try{
Class.forName("com.mysql.jdbc.Driver");
System.out.println(4);
conn=DriverManager.getConnection(url,"dbsml","28129");
stmt=conn.createStatement();
}catch (SQLException e) {
System.out.println("MySQL操作错误");
e.printStackTrace();
增加:
System.out.println("actionPerformed4");
b4.setPreferredSize(new Dimension(120, 40));
b4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// // TODO Auto-generated method stub
try {
jt.print();
} catch (PrinterException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
删除:
try{
con=DriverManager.getConnection(url,"dbsml","28129");
stmt=con.createStatement();
sql = "select * from course where C_id = '" + t1.getText() + "'";
ResultSet rs = stmt.executeQuery(sql);
if(rs.next()){
sql="DELETE FROM course WHERE(C_id='"+t1.getText()+"')";
stmt.executeUpdate(sql);
sql="DELETE FROM tc WHERE(C_id='"+t1.getText()+"')";
stmt.executeUpdate(sql);
sql="DELETE FROM sc WHERE(C_id='"+t1.getText()+"')";
stmt.executeUpdate(sql);
JOptionPane.showMessageDialog(this,"删除课程成功!","提示",JOptionPaneRMATION_MESSAGE);
else
JOptionPane.showMessageDialog(this,"此课程不存在!","提示",JOptionPaneRMATION_MESSAGE);
stmt.close();
con.close();
}catch(SQLException e2){
e2.printStackTrace();
t1.setText("");
查询:
try{
sql = "SELECT * FROM " + getTable() + " WHERE "+ chooseState() + " = '" + t1.getText() + "'" +
" and " + getPassword() + " = '" + t2.getText() + "'";
System.out.println(sql);
ResultSet rs = stmt.executeQuery(sql);
if(rs.next()){
result = true;
System.out.println(result);
stmt.close();
conn.close();
}catch (SQLException e) {
System.out.println("MySQL操作错误");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
获取Choice状态:
public int getState(){
System.out.println(7);
int state = 1;
if(c.getSelectedItem().equals("管 理 员")){
state = 1;
System.out.println(8);
}else if(c.getSelectedItem().equals("教 师")){
state = 2;
System.out.println(9);
else if(c.getSelectedItem().equals("学 生")){
state = 3;
System.out.println(10);
return state;
给Choice增加查询到的item
public void addChoice() throws SQLException {
// TODO Auto-generated method stub
System.out.println("addChoice");
conn = getConnection();
stmt = conn.createStatement();
sql = "select C_name from teacher natural join tc natural join course where T_id = '"+DLA.t1.getText()+"'";
ResultSet rs = stmt.executeQuery(sql);
System.out.println(sql);
while(rs.next()){
c.add(rs.getString(1));
给TableModle加数据
class MyTableModel1 extends AbstractTableModel{
String kcnum,kcname,score;
final String[] columnNames={"课程号","课程名","学分"};
Object[][]data=new Object[100][3];
public MyTableModel1(){
int m=0;
String url="jdbc:mysql://localhost:3306/dbsml?"
+ "user=dbsml & password=28129";
Connection con;
String sql;
Statement stmt;
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(java.lang.ClassNotFoundException e){
try{
con=DriverManager.getConnection(url,"dbsml","28129");
stmt=con.createStatement();
sql="SELECT * FROM tc natural join course WHERE T_id='"+DLA.t1.getText()+"'";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){
kcnum=rs.getString(1);
kcname=rs.getString(3);
score=rs.getString(5);
data[m][0]=kcnum;data[m][1]=kcname;data[m++][2]=score;
stmt.close();
con.close();
}catch(SQLException e){
public int getColumnCount(){
return columnNames.length;
public int getRowCount(){
return data.length;
public String getColumnName(int col){
return columnNames[col];
public Object getValueAt(int row,int col){
return data[row][col];
public void setValueAt(Object value,int row,int col){
int numRows=getRowCount();
int numCols=getColumnCount();
for(int i=0;i<numRows;i++){
for(int j=0;j<numCols;j++){
System.out.print(" "+data[i][j]);
打印:
下载:
int m=0;
System.out.println("actionPerformed3");
Boolean result=false;
try{
Class.forName("com.mysql.jdbc.Driver");
System.out.println(4);
conn=getConnection();
Statement stmt=conn.createStatement();
System.out.println(5);
String sql = "select C_name,S_id,S_name,State_name,score from sc "
+ "natural join student natural join state natural join tc natural"
+ " join course"
+ " where T_id='"+DLA.t1.getText()+"'and C_name = '"+getChoice()+"'";
System.out.println(sql);
ResultSet rs = stmt.executeQuery(sql);
rs.last();
int temp=rs.getRow();
rs.beforeFirst();
o2=new Object[temp][5];
while(rs.next()){
System.out.println(rs.getString(1));
o2[m][0]=rs.getString(1);
o2[m][1]=rs.getString(2);
o2[m][2]=rs.getString(3);
o2[m][3]=rs.getString(4);
o2[m++][4]=rs.getString(5);
System.out.println(result);
stmt.close();
conn.close();
}catch (SQLException c) {
System.out.println("MySQL操作错误");
c.printStackTrace();
} catch (Exception d) {
d.printStackTrace();
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
if (JFileChooser.APPROVE_OPTION == chooser.showSaveDialog(null)) {
File saveFile = chooser.getSelectedFile();
if (saveFile.exists()) {
JOptionPane.showConfirmDialog(null, "文件已存在是否覆盖",
"文件存在", JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE);
} else {
try {
// 打开文件
String filepath = saveFile.getPath() + ".xls";
File fi = new File(filepath);
WritableWorkbook book = Workbook.createWorkbook(fi);
// 生成名为“第一页”的工作表,参数0表示这是第一页
WritableSheet sheet = book.createSheet("第一页", 0);
// 在Label对象的构造子中指名单元格位置是第一列第一行(0,0)
// 以及单元格内容为test
Label label = new Label(0, 0, "课程名称");
Label label01 = new Label(1, 0, "学生学号");
Label label02 = new Label(2, 0, "学生姓名");
Label label03 = new Label(3, 0, "课程状态");
Label label04 = new Label(4, 0, "课程成绩");
// 将定义好的单元格添加到工作表中
sheet.addCell(label);
sheet.addCell(label01);
sheet.addCell(label02);
sheet.addCell(label03);
sheet.addCell(label04);
* 生成一个保存数字的单元格 必须使用Number的完整包路径,否则有语法歧义
* 单元格位置是第二列,第一行,值为789.123
for (int i = 0; i < o2.length; i++) {
for (int k = 0; k < o2[i].length; k++) {
Label lab = new Label(k, i + 1, o2[i][k]
.toString());
sheet.addCell(lab);
// 写入数据并关闭文件
book.write();
book.close();
} catch (Exception e1) {
System.out.println(e1);
展开阅读全文