
| 题目: | 学生信息管理系统 |
| 院 系: | |
| 专 业: | |
| 班 级: | |
| 学 号: | |
| 姓 名: | |
| 日 期: |
课程设计任务书
一、设计题目
学生信息管理系统的设计
二、设计概述
通过对学校日常教学管理中的课程、选课、学生、教师、成绩等相关内容进行分析,完成具有学生管理、成绩管理、课程管理等相关功能的小型数据库管理应用系统。
三、设计要求
1、完成进学生、班级、课程表的维护
2、完成成绩表的浏览查找
3、完成成绩表的维护
4、完成用户管理功能
5、完成数据备份与恢复功能
四、进度安排
1、资料查找、系统分析,概要设计 (2天)
2、系统详细设计、功能设计(2天)
3、算法实现、编程调试(2天)
4、功能演示、资料整理、课程设计说明书编写。(1天)
一、概述
1.1设计背景
该项目的开发的系统为学生信息管理系统软件,是鉴于目前学校快速发展,学校规模越来越大,学校与时俱进,课程不断改革,学生数量都在迅速的增长,学生信息呈爆炸性增长的前提下,原始的手工管理耗费学生与工作人员大量的时间和精力,而效率与准确性却很低,学校对学生信息管理的自动化与准确和的要求日益强烈,为满足学校管理学生信息的需要,设计并完成该系统。
1.2 设计内容
系统完成后可用于学校学生信息管理,能够实现对学生信息进行存储、查询、修改等功能。
1.3设计方法与步骤
1.3.1设计方法
手工与经验相结合方法: 设计质量与设计人员的经验和水平有直接关系;数据库运行一段时间后常常不同程度地发现各种问题,增加了维护代价。
规范设计法:基本思想为过程迭代和逐步求精。
新奥尔良(New Orleans)方法:将数据库设计分为若干阶段和步骤
基于E-R模型的数据库设计方法:概念设计阶段广泛采用
3NF(第三范式)的设计方法:逻辑阶段可采用的有效方法
ODL(Object Definition Language)方法:面向对象的数据库设计方法
1.3.2 设计步骤
1、需求分析
2、概念结构设计
3、逻辑结构设计
4、物理结构设计
5、数据库实施
6、数据库运行和维护
1.4相关软件的选用
Mysq5.5+Myeclipse8.6+Navicat 8.0 MySQL
二、系统需求分析
2.1功能需求:
1) 学生信息管理:可以实现对学生信息的添加、删除和修改
2) 选课管理:可以通过学号和课程进行选课
3) 课程信息管理:可以实现对课程信息的添加、删除和修改
4) 成绩管理:可以实现对指定学号的指定课程进行成绩录入,还能对已经录入的成绩进行修改
5) 信息查询:
a、学生查询,可以分别通过学号、姓名、性别、学院专业查询相应的学生信息
b、课程查询,可以分别根据课程名或授课教师来查询课程信息
c、成绩查询,可以通过输入学生学号查询该学生的所选课成绩
2.2系统完整性需求:
a、各种信息记录的完整性,信息记录内容不能为空;
b、各种数据间相互的联系的正确性;
c、相同的数据在不同记录中的一致性。
2.3数据流图:
学生信息管理的第一层数据流图:
图1.1
学生信息第二层数据流图:
图1.2
课程信息第二层数据流图:
图1.3
成绩信息第二层数据流图:
图1.4
2.4数据字典
1、数据项:学号
含义说明:唯一标识一个学生
别名:sno
类型:字符型
长度:10
取值范围:0000000000至9999999999
取值含义:前两位标别该学生所在年级, 后六位按顺序编号
数据项:课程编号
含义说明:唯一标识一个课程
别名:cno
类型:字符型
长度:10
取值范围:0000000000至9999999999
数据项:学生姓名
含义说明:是人类为区分个体,给每个个体给定的特定名称符号,是通过语言文字信息区别人群个体差异的标志
别名:sname
类型:字符型
长度:10
取值范围:0000000000至9999999999
数据项:性别
含义说明:男女两性的区别
别名:ssex
类型:字符型
长度:3
数据项:籍贯
含义说明:祖居地或原籍
别名:shome
类型:字符型
长度:50
数据项:入学年份
含义说明:进入这所学校读书的时间
别名:syear
类型:字符型
长度:10
数据项:专业
含义说明:学校里的学业门类
别名:smajor
类型:字符型
长度:10
数据项:学院
含义名称:在学校里所属专业的院系
别名:scollege
类型:字符型
长度:10
数据项:出生日期
含义名称:一个人出生的日子
别名:sbirth
类型:时间日期类型
数据项:课程名称
含义名称:区分课程给定的标签
别名:cname
类型:字符型
长度:12
数据项:成绩
含义名称:学生考试所得的分数
别名:grade
类型:整型
2、数据结构:学生
含义说明:定义了一个描述学生的信息结构
组成:学号、学生姓名、性别、民族、籍贯、入学年份、专业、学院、出生日期
数据结构:课程
含义说明:定义了一个描述课程的信息结构
组成:课程编号、课程名称、授课教师、课程类别、上课地点、上课时间
数据结构:成绩
含义说明:定义了一个描述成绩的信息
组成:学号、课程编号、成绩
3、数据流:成绩管理信息
数据流来源:学生信息表,课程信息表
数据流去向:成绩信息表
组成:学生编号、课程名称
4、数据存储:学生信息表、课程信息表、成绩信息表
说明:记录学生、成绩、课程情况
流入数据流:学籍信息管理、课程管理信息
流出数据流:成绩管理信息
组成:学生编号、学生姓名、课程编号、课程名称、成绩信息
5、处理过程:
添加、删除、修改、查询学籍信息、课程信息、成绩信息
说明:完成学籍、课程、成绩的各种操作
输入:学生编号、课程名称
输出:学生信息、课程信息、成绩信息的添加、修改、删除和查询结果
处理:如果有新生入学,就要进行学生各种信息的添加;如果有毕业生离校,就要对学生各种信息进行删除;如果某个学生的信息需要修改,则对其相应信息进行修改
三、概念结构设计
3.1架构设计
为了方便开发维护,系统采用双重架构,包括视图层和业务逻辑层。视图层用于接受数据,显示结果、数据验证和调用业务逻辑等;视图层是系统最终操作用户看到并与之交互的界面,与用户直接接触。业务逻辑层主要进行业务逻辑处理,与数据库接触,对数据进行后台的更新;业务逻辑也分为两部分:实体类和管理类,实体类中的字段与数据库一一对应,方便对数据库的操作;操作逻辑由管理类实现,系统架构模型如下:
图3.1架构模型
3.2系统的程序流程图
系统可以实现下面的功能:
1) 学生信息管理:可以实现对学生信息的添加、删除和修改
2) 选课管理:可以通过学号和课程进行选课
3) 课程信息管理:可以实现对课程信息的添加、删除和修改
4) 成绩管理:可以实现对指定学号的指定课程进行成绩录入,还能对已经录入的成绩进行修改
5) 信息查询:
a、学生查询,可以分别通过学号、姓名、性别、学院专业查询相应的学生信息
b、课程查询,可以分别根据课程名或授课教师来查询课程信息
c、成绩查询,可以通过输入学生学号查询该学生的所选课成绩
下图是系统的程序流程图:
图3.2
3.3学生信息管理系统E-R图
根据实际需要分析,可以画出得到系统E-R图,其结果代表了用户的数据需求,决定了数据库的总体逻辑结构,是建立成功数据库的关键。学生信息管理系统E-R图如下所示:
1、学生实体E-R图
图3.3
2、课程实体E-R图
图3.4
3、成绩实体E-R图
图3.5
4、总的E-R图
图3.6
四、逻辑结构设计
4.1逻辑设计
以下是学生信息管理的关系模型:
1.学生(学生学号,姓名,性别,民族,籍贯,入学时间,专业,院系,出生年月)
2.课程(课程编号,课程名称,授课教师,课程类别,上课地点,上课时间)
3.成绩(学生学号,课程编号,成绩)
将上面的数据库概念结构化转化为数据库系统所支持的实际数据模型,也就是数据库的逻辑关系。在上面实体以及实体之间关系的基础上,形成数据库中的表格以及各个表格之间的关系。
Student信息表
| 属性名 | 存储代码 | 类型 | 长度 | 备注 |
| 学号 | sno | String | 20 | 学生学号(学生的唯一标识) |
| 姓名 | sname | String | 20 | 学生姓名 |
| 性别 | ssex | String | 3 | 性别(男、女) |
| 名族 | sethnix | String | 10 | 民族 |
| 籍贯 | shome | String | 50 | 籍贯(省份,城市) |
| 入学时间 | syear | String | 10 | 格式(XXXX/X/X) |
| 专业 | smajor | String | 10 | 学生所在专业 |
| 院系 | scollege | String | 10 | 所属院系 |
| 出生年月 | sbirth | String | 10 | 格式(XXXX/XX/XX) |
| 属性名 | 存储代码 | 类型 | 长度 | 备注 |
| 课程号 | cno | String | 20 | 课程编号(课程的唯一标识) |
| 课程名称 | cname | String | 20 | 课程名称 |
| 授课教师 | cteachet | String | 12 | 教师姓名 |
| 科目类型 | ctype | String | 10 | 课程的科目类型 |
| 上课地点 | cplace | String | 20 | 课室编号 |
| 上课时间 | ctime | String | 20 | 每周的上课时间 |
| 属性名 | 存储代码 | 类型 | 长度 | 备注 |
| 学生学号 | sno | String | 20 | 与课程编号共同标识成绩 |
| 课程编号 | cno | String | 20 | 与学生学号共同标识成绩 |
| 成绩 | grade | int | 4 | 教师姓名 |
根据上述系统综合需求分析中的功能整合,划分为三个主要功能模块:
1、学生管理模块
2、课程管理模块
3、成绩管理模块
模块功能划分如图3.1所示
图4.2系统模块框架图
4.3功能业务流程设计
1、添加学生信息:包括姓名、性别、民族、几关、出生日期、入学年份、专业、学院等,用户核对无误后,按确定将信息添加到数据库。
2、修改学生信息:输入学号,查询并显示学生信息,除学号外,其他信息都可以修改,用户核对无误后,按确定将修改后的信息保存到数据库。
3、删除学生信息:输入学生学号,提示是否删除该记录,按确定从数据库删除该学生信息。
4、学生选课:从列表中选择学生学号和需要选的课程,显示所选课程的详细信息,用户核对无误后,按确定将选课信息保存到数据库。
5、查询学生信息:可以同过学生学号、姓名、性别、院系和专业进行查询,显示用表格显示所有符合条件的学生信息
6、添加课程信息:包括课程编号、课程名称、授课教师、课程类别、上课地点和上课时间,用户核对无误后,按确认将新的课程信息保存到数据库中。
7、修改课程信息:输入课程编号,查询并显示课程详细信息,修改相应信息,用户核对无误后,按修改将修改后的信息保存到数据库
8、删除课程信息:输入课程编号,提示删除信息,按确定从数据库中删除该课程信息
9、课程查询:可以通过课程名城、授课教师查询课程的详细信息,显示所有符合条件的课程信息
10、成绩添加:输入学号和所选课程,显示课程详细信息,只有成绩可输入,录入成绩,按确定将成绩信息保存到数据库。
11、修改成绩:输入学号及所选课程,显示课程详细信息,只有成绩可以修改,修改成绩,按修改将修改后的数据保存到数据库。
12、查询成绩:输入学生的学号查询该学生的所用选课成绩,并用表格打印显示
五、数据库物理设计
5.1数据库的物理设计
▪数据库在物理设备上的存储结构与存取方法称为数据库的物理结构,它依赖于选定的数据库管理系统
▪为一个给定的逻辑数据模型选取一个最适合应用环境的物理结构的过程,就是数据库的物理设计数据库
5.2物理设计的步骤
▪确定数据库的物理结构,在关系数据库中主要指存取方法和存储结构
▪对物理结构进行评价,评价的重点是时间和空间效率
▪ 如果评价结果满足原设计要求,则可进入到物理实施阶段,否则,就需要重新设计或修改物理结构,有时甚至要返回逻辑设计阶段修改数据模型
5.3设计物理数据库结构的准备工作
▪对要运行的事务进行详细分析,获得选择物理数据库设计所需参数
▪充分了解所用RDBMS的内部特征,特别是系统提供的存取方法和存储结构
六、数据库的实施与维护
6.1学生信息表的sql语句
create table student(
sno varchar(20) primary key,
sname varchar(20),
ssex varchar(3),
sethnix varchar(10),
shome varchar(50),
syear varchar(10),
smajor varchar(10),
scollege varchar(10),
sbirth varchar(10)
);
6.2课程信息表的sql语句
create table course(
cno varchar(20) primary key,
cname varchar(20),
cteacher varchar(12),
ctype varchar(20),
cplace varchar(12),
ctime varchar(10)
);
6.3成绩信息表的sql语句
create table grade(
sno varchar(20),
cno varchar(20),
grade int,
constraint pk_grade primary key(sno,cno)
);
6.4写进相关数据
6.4.1建立课程表
课程信息数据表的主要功能在于保存课程的相关信息,包括:‘课程编号(cno)’‘课程名称(cname)’、‘授课教师(cteacher)’、‘课程类别(ctype)’、‘上课地点(cplace)’、‘上课时间(ctime)’。
6.4.2建立成绩表
成绩信息数据表的主要功能在于保存成绩相关信息,包括:‘学号(sno)’‘课程编号(cno)’、‘成绩(grade)’。
6.4.3建立学生表
物件信息数据表的主要功能在于保存主要信息和相关信息,包括:‘学号(sno)’‘学生姓名(sname)’、‘性别(ssex)’、‘民族(sethnix)’、‘入学年份(syear)’、‘专业(smajor)’、‘学院(scollege)’、‘出生日期(sbirth)’。
6.5系统的实现
6.5.1 系统的运行支持环境
安装WINDOWS 2000或更高的版本OS,必须安装Eclipse开发工具,安装SQL 2000版本或更高版本。
6.5.2 各大模块的实现
对象其实就是模块,把数据结构和操作这些数据的方法紧密地结合在一起就构成了模块。
本系统将功能列表中的功能整合、划分为三个主要功能模块:学生管理模块、课程管理模块、成绩管理模块。
6.5.3 包的实现与类的管理
本系统采用两层架构,视图层和业务逻辑层,其中业务逻辑层分为两部分——实体类和管理类。为方便管理,将其分别放置在不同的包中,其中实体类放在sims.com.model包中,管理类放在sims.com.manager包中,视图中放置在sims.com.view包中,本系统还需要一个用于连接数据库的公共类,放置在sims.com.dbconn包中。
工程结构如图所示。
6.5.4业务逻辑层之实体类的实现
实体类是与数据库关系最密切的层,其中包含的类与数据库中的表一一对应,类的属性与数据库中的字段一一对应,而方法则主要是get和set方法。
其主要功能是为实现对数据库表的增、删、改、查等操作,提供相应的对象。
根据数据字典已知,数据库中将建立三个表,则实体类包含与之一一对应的三个类,分别是:Student类,与学生信息表对应;Course类,与课程信息表对应;Grade类,与学生选课及成绩信息表对应。另外,根据业务对象模型可知,数据库的三个表之间存在关联,在对表做增、删、改、查等操作时,存在同时对多表进行操作,因此还需要一个综合类,用于封装多表的信息。
根据以上分析,实体类包含三个类,分别放在三个java文件中,还需要一个综合类,为方便管理,所有实体类及综合类都放在sims.com.model包下。
6.5.5连接数据库公共类的实现
实体类用于提供操作数据库的对象,要操作数据库,需要使用JDBC连接数据库。本系统设计一个公共类DBConn,用于实现连接数据库的功能,放置在sims.com.dbconn包中,文件名为DBConn.java。
其代码如下:
public class Conn {
public Connection conn = null;
public void createConn(){
String DRIVER = "com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/studentms?user=root&password=admin&useUnicode=true&characterEncoding=gb2312";
if(conn == null){
try{
Class.forName(DRIVER).newInstance();
conn = DriverManager.getConnection(url);
}catch(Exception e){
e.printStackTrace();
}
}
}
public Connection getConn(){
if(conn == null){
createConn();
}
return conn;
}
public void closeConn(){
if(conn != null){
try {
conn .close();
conn = null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
public ResultSet executeQuery(String sql) {
ResultSet rs = null;
if (conn == null) {
createConn();
}
try {
Statement stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
} catch (Exception e) {
e.printStackTrace();
}
return rs;
}
public void executeUpdate(String sql) {
if (conn == null) {
createConn();
}
try {
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
stmt.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.5.6.业务逻辑层之管理类的实现
管理类用于接受用户的输入并调用实体类对数据库进行持久化操作,调用视图层相应用户的操作、满足用户的需求,是整个系统最核心的部分。
为方便管理,将控制层中的所有类,放置在sims.com.manager包中。
针对三个实体类,设计三个管理类,其中StudentManager类管理Student类,放在StudentManager.java文件中;CourseManager类管理Course类,放在CourseManager.java文件中;GradeManager类管理Grade类,放在GradetManager.java文件中。
1、StudentManager.java
StudentManager类用于管理Student类,主要包含:添加学生信息的方法——addStudent;删除学生信息的方法——deleteUser;修改学生信息的方法——update_Student;根据学号查询学生信息的方法——findStudent;根据姓名查询学生信息的方法——findStudentname;根据性别查询学生信息的方法——findStudentsex;根据专业查询学生信息的方法——findStudentmajor等方法。
其部分代码如下:
public class StudentManager { //学生信息管理部分
Connection conn = null; //连接数据库对象
Statement stmt = null; //能够跑sql语句对象
ResultSet rs = null; //执行sql语句的返回结果
public int addStudent(Student s) { //添加学生信息
Conn cn = new Conn();
conn = cn.getConn();
int i = 0;
String sql = "insert into Student values('" + s.getSno() + "','" +
s.getSname() + "','" + s.getSsex() + "','" + s.getSethnix() +
"','" + s.getShome() + "','" + s.getSyear() + "','" +
s.getSmajor() + "','" + s.getScollege() + "','" +
s.getSbirth() + "')";
try {
stmt = conn.createStatement();
i = stmt.executeUpdate(sql);
stmt.close();
conn.close();
} catch (Exception e1) {
e1.printStackTrace();
}
return i;
}
public Student findStudent(String sno) { //根据学号查询一个学生
String sql = "select *from Student where sno='" + sno + "'";
Student s = null;
Conn cn = new Conn();
conn = cn.getConn();
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) {
s = new Student();
s.setSno(rs.getString("sno"));
s.setSname(rs.getString("sname"));
s.setSsex(rs.getString("ssex"));
s.setSethnix(rs.getString("sethnix"));
s.setShome(rs.getString("shome"));
s.setSyear(rs.getString("syear"));
s.setSmajor(rs.getString("smajor"));
s.setScollege(rs.getString("scollege"));
s.setSbirth(rs.getString("sbirth"));
}
rs.close();
stmt.close();
conn.close();
}
catch (SQLException ex3) {
ex3.printStackTrace();
}
return s;
}
2、CourseManager.java
CourseManager类用于管理Course类,主要包含:添加课程信息的方法——addCourse;删除课程信息的方法——deleteCourser;修改课程信息的方法——update_Course;根据课程编号查询课程信息的方法——findCourse;根据姓名查询课程信息的方法——findCourse_name;根据课程名称查询课程信息的方法——findCourse_teacher;根据专业查询学生信息的方法——findStudentmajor等方法。
其部分代码如下:
public class CourseManager {//课程管理部分
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
public int addCourse(Course c) { //添加课程
Conn cn = new Conn();
conn = cn.getConn();
int i = 0;
String sql = "insert into course values('" + c.getCno() + "','" +
c.getCname() + "','" + c.getCteacher() + "','" +
c.getCtype() + "','" + c.getCplace() + "','" + c.getCtime() +
"')";
try {
stmt = conn.createStatement();
i = stmt.executeUpdate(sql);
stmt.close();
conn.close();
} catch (Exception e1) {
e1.printStackTrace();
}
return i;
}
public Course findCourse(String cno) { //根据课程编号查询
String sql = "select *from course where cno='" + cno + "'";
Course c = null;
Conn cn = new Conn();
conn = cn.getConn();
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) {
c = new Course();
c.setCno(rs.getString("cno"));
c.setCname(rs.getString("cname"));
c.setCteacher(rs.getString("cteacher"));
c.setCtype(rs.getString("ctype"));
c.setCplace(rs.getString("cplace"));
c.setCtime(rs.getString("ctime"));
}
rs.close();
stmt.close();
conn.close();
}
catch (SQLException ex3) {
ex3.printStackTrace();
}
return c;
}
3、GradeManager.java
GradeManager类用于管理Grade类,主要包含:添加成绩的方法——addGrade;删除成绩的方法——deleteGrade;修改课程信息的方法——update_Course;根据学号、课程名称查询课程信息的方法——findGrade;根据学号查询一个学生全部学科的成绩——selectGradestudent等方法。
其部分代码如下:
public class GradeManager { //分数管理部分
Connection conn = null; //连接数据库对象
Statement stmt = null; //能够跑sql语句对象
ResultSet rs = null; //执行sql语句的返回结果
public int addGrade(Grade g) { //添加成绩
Conn cn = new Conn();
conn = cn.getConn();
int i = 0;
String sql = "update grade set grade='" + g.getGrade() + "'where sno='" +
g.getSno() + "'and cno='" + g.getCno() + "'";
try {
stmt = conn.createStatement();
i = stmt.executeUpdate(sql);
stmt.close();
conn.close();
} catch (Exception e1) {
e1.printStackTrace();
}
return i;
}
public int chooseCourse(String sno, String cno) { //选课
Conn cn = new Conn();
conn = cn.getConn();
int i = 0;
String sql = "insert into grade values('" + sno + "','" + cno +
"',' ')";
try {
stmt = conn.createStatement();
i = stmt.executeUpdate(sql);
stmt.close();
conn.close();
} catch (Exception e1) {
e1.printStackTrace();
}
return i;
}
七、总结
7.1遇到的主要问题和解决方法
1、对于使用java图形界面程序进行前台功能和菜单模块的设计经验较少,一般都是进行比较少功能的图形界面进行设计。
2、java图形界面的最基本组成部分是组件,组件是一个可以图形化方式显示在屏幕上并能与用户进行交互的对象,并且,组件不能地像是处理,必需将组件放在一定的容器中才可以显示处理。Java GUI提供window和panel两种主要容器,因此,如何将各种组件整合在容器中能够实现界面的友好以及操作的简单。
3、在java图形界面程序设计中,为了是图形用户界面具有良好的平台无关性,使用布局管理器来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式,但AWT中提供了多种不同的布局管理器类型,对于是使用flowlayout、borderlayout、gridlayout还是cardlayout等布局管理器,觉得单一使用哪个觉得不好,因此,将panel作为一个组件添加到某个容器中嵌套使用,以实现多种布局管理器的使用。
4、另外,对于java GUI事件处理机制并不熟悉,花费了相当的时间进行研究以便能够粗略使用,以便java图形界面程序能够顺利实现。
5、代码量较大,因此要2人负责进行设计,而且不同的人对于界面想法总会有各自的特点,基于本次课程设计,团队在对其设计和编写时总会有自己的特点,以至于对于整个设计总是会有不少的微调。对此的解决方法是每做完一部分的设计后团队就进行一次新的探讨,针对于之前设计的总结和对后续工作的安排和要求,使得界面比较能够符合团队的要求。
7.2创新和得意之处
视图层是用户看到并与之交互的界面,对于用户来说,视图层就是整个系统,因为其他曾对于用户是透明的。根据功能模块的划分与以用户为中心的原则,共设计18个类,其中包括主界面、添加学生信息界面、修改学生信息界面和删除学生信息等界面,对于这些界面,使用的代码在每个界面中都类似,因此只需在已经做好的界面代码中进行添加、删除和修改代码就能够完成又一个界面的设计,只是对于修改需要小心谨慎,打错了代码会比较难找到来进行修改。
7.3课程设计中存在的不足
在这次的课程设计中其中有一点不足的是并未实现网页版的应用,这对用户的系统环境要求较高,若是普通并未安装JAVA程序的话无法使用软件,但本学生信息管理系统面向用户广泛,目前采用的程序无法满足程序设计“易操作”的原则。另外,并没有进行更多的需求分析,未了解客户的更多需求和用户体验的回馈。由于程序制作时间周期短,在这方面中缺少了亲自采集需求信息与用户体验实践的过程,这也是非常之遗憾的,毕竟以后出到外面如果我们从事这方面的工作这也是一个经验,希望在以后的过程中能够真正的有完全实践的机会吧!
7.4需进一步改进的设想
把软件做成网页是当今的网络发展趋势,用户不需要下载安装系统环境,那些数据都能像E-MAIL、blog那样存放在各个网站服务器上,随时随地供你调用,只需要打开浏览器就能方便的使用软件中的功能。在学生信息管理系统的改进设想中,我希望能将软件进一步改进设计成网页版,让更多的用户能随时随地访问使用,不需要受系统环境的。另外,进行多方面信息的采集,了解教师与学生等各方的需求信息与更多细节,让他们亲自测试软件并反馈用户体验信息,让软件更加完善更加方便易用亲近用户。
7.5课程设计的感谢和心得体会
这次课程设计的目的在于加深对数据库原理、管理信息系统基础理论和基本知识的理解,进一步掌握利用结构化方法对管理信息系统进行分析与设计的基本原则、方法和步骤,培养我们解决实际问题、开发信息管理系统的实践能力。同时课程设计充分体现“教师指导下的以学生为中心”的教学模式,以学生为认知主体,充分调动学生的积极性和能动性,重视学生自学能力的培养。通过这次课程设计使我们认识了管理信息系统开发的基本过程,能够运用系统分析和设计方法进行管理信息系统的开发。
与其临渊羡鱼,不如退而结网。这次数据库课程设计给我的最大的印象就是如果自己有了兴趣,就动手去做,困难在你的勇气和毅力下是抬不了头的。从做这个数据库开始无论遇到什么困难,我都没有一丝的放弃的念头。出于对知识的渴望,出于对新技术的好奇,出于对一切未知的求知。我完成了这次数据库课程设计。我也希望日后能将这个软件更多的完善,让它应用于更广泛的用户,让用户有更好的应用体验。
我很感激学校给了我们这次动手实践的机会,让我们有了一个共同学习,增长见识,开拓视野的机会。也感谢老师们对我们无私忘我的指导,我会以这次课程设计作为对自己的激励,继续学习数据库知识。毕竟学习就是一个just do it的过程!
附录
部分图形界面代码如下:
package sims.com.view;
import sims.com.manager.CourseManager;
import sims.com.model.Course;
import javax.swing.JPanel;
import java.awt.Color;
import javax.swing.JLabel;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import sims.com.manager.CourseManager;
public class Add_coursePanel extends JPanel {//添加课程
public Add_coursePanel() {
try {
jbInit();
} catch (Exception exception) {
exception.printStackTrace();
}
}
private void jbInit() throws Exception {
this.setLayout(null);
this.setBackground(new Color(170, 178, 200));
btn_add.setBounds(new Rectangle(37, 182, 81, 23));
btn_add.setText("添加");
btn_add.addActionListener(new Add_coursePanel_btn_add_actionAdapter(this));
btn_null.setBounds(new Rectangle(153, 182, 81, 23));
btn_null.setText("清空");
btn_null.addActionListener(new Add_coursePanel_btn_null_actionAdapter(this));
btn_exit.setBounds(new Rectangle(267, 182, 81, 23));
btn_exit.setText("退出");
btn_exit.addActionListener(new Add_coursePanel_btn_exit_actionAdapter(this));
jLabel1.setText("课程类别");
jLabel1.setBounds(new Rectangle(198, 87, 62, 15));
jLabel2.setToolTipText("");
jLabel2.setText("授课教师");
jLabel2.setBounds(new Rectangle(28, 86, 53, 15));
tctime.setBounds(new Rectangle(265, 123, 77, 20));
tcno.setBounds(new Rectangle(93, 45, 77, 20));
tteacher.setBounds(new Rectangle(91, 85, 77, 20));
jLabel3.setText("上课时间");
jLabel3.setBounds(new Rectangle(199, 124, 57, 15));
jLabel4.setText("课程编码");
jLabel4.setBounds(new Rectangle(20, 47, 65, 15));
jLabel5.setText("课程名称");
jLabel5.setBounds(new Rectangle(201, 47, 60, 15));
tcplace.setBounds(new Rectangle(93, 123, 77, 20));
tctype.setBounds(new Rectangle(265, 85, 77, 20));
tcname.setBounds(new Rectangle(2, 44, 77, 20));
jLabel6.setText("上课地点");
jLabel6.setBounds(new Rectangle(19, 124, 67, 15));
this.add(tteacher);
this.add(jLabel1);
this.add(jLabel2);
this.add(tctime);
this.add(tcno);
this.add(jLabel3);
this.add(jLabel5);
this.add(tcplace);
this.add(tctype);
this.add(tcname);
this.add(jLabel6);
this.add(jLabel4);
this.add(btn_null);
this.add(btn_add);
this.add(btn_exit);
this.setVisible(true);//窗体可见性
this.setSize(600, 600);//设置窗体大小
}
JButton btn_add = new JButton();
JButton btn_null = new JButton();
JButton btn_exit = new JButton();
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JTextField tctime = new JTextField();
JTextField tcno = new JTextField();
JTextField tteacher = new JTextField();
JLabel jLabel3 = new JLabel();
JLabel jLabel4 = new JLabel();
JLabel jLabel5 = new JLabel();
JTextField tcplace = new JTextField();
JTextField tctype = new JTextField();
JTextField tcname = new JTextField();
JLabel jLabel6 = new JLabel();
public void btn_add_actionPerformed(ActionEvent e) {
String cno = ""; //定义空的学生信息属性
String cname = "";
String cteacher = "";
String ctype = "";
String cplace = "";
String ctime = "";
if (!tcno.getText().equals("")) {
cno = tcno.getText();//获得课程名称文本框中的内容
} else {
JOptionPane.showMessageDialog(this, "课程编码不能为空!", "提示信息
JOptionPane.ERROR_MESSAGE);
return;
}
if (!tcname.getText().equals("")) {
cname = tcname.getText();
} else {
JOptionPane.showMessageDialog(this, "课程名称不能为空!", "提示信息
JOptionPane.ERROR_MESSAGE);
return;
}
if (!tteacher.getText().equals("")) {
cteacher = tteacher.getText();
} else {
JOptionPane.showMessageDialog(this, "授课教师不能为空!", "提示信息
JOptionPane.ERROR_MESSAGE);
return;
}
if (!tctype.getText().equals("")) {
ctype = tctype.getText();
} else {
JOptionPane.showMessageDialog(this, "课程类别不能为空!", "提示信息
JOptionPane.ERROR_MESSAGE);
return;
}
if (!tcplace.getText().equals("")) {
cplace = tcplace.getText();
} else {
JOptionPane.showMessageDialog(this, "上课地点不能为空!", "提示信息
JOptionPane.ERROR_MESSAGE);
return;
}
if (!tctime.getText().equals("")) {
ctime = tctime.getText();
} else {
JOptionPane.showMessageDialog(this, "上课时间不能为空!", "提示信息
JOptionPane.ERROR_MESSAGE);
return;
}
Course c = new Course();//定义课程信息并对信息封装
c.setCno(cno);
c.setCname(cname);
c.setCteacher(cteacher);
c.setCtype(ctype);
c.setCplace(cplace);
c.setCtime(ctime);
CourseManager cm = new CourseManager();//调用添加课程信息方法
int i = cm.addCourse(c);
if (i > 0) {
JOptionPane.showMessageDialog(this, "添加成功!", "提示信息
JOptionPane.INFORMATION_MESSAGE);
tcno.setText("");//清空文本框内容
tcname.setText("");
tctype.setText("");
tcplace.setText("");
tteacher.setText("");
tctime.setText("");
} else {
JOptionPane.showMessageDialog(this, "添加失败!", "提示信息
JOptionPane.ERROR_MESSAGE);
}
}
public void btn_null_actionPerformed(ActionEvent e) {
tcno.setText("");//清空文本框内容
tcname.setText("");
tteacher.setText("");
tctype.setText("");
tcplace.setText("");
tctime.setText("");
}
public void btn_exit_actionPerformed(ActionEvent e) {
this.setVisible(false);//退出按钮关闭当前页面
}
}
class Add_coursePanel_btn_exit_actionAdapter implements ActionListener {
private Add_coursePanel adaptee;
Add_coursePanel_btn_exit_actionAdapter(Add_coursePanel adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.btn_exit_actionPerformed(e);
}
}
class Add_coursePanel_btn_null_actionAdapter implements ActionListener {
private Add_coursePanel adaptee;
Add_coursePanel_btn_null_actionAdapter(Add_coursePanel adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.btn_null_actionPerformed(e);
}
}
class Add_coursePanel_btn_add_actionAdapter implements ActionListener {
private Add_coursePanel adaptee;
Add_coursePanel_btn_add_actionAdapter(Add_coursePanel adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.btn_add_actionPerformed(e);
}
}
package sims.com.view;
import sims.com.manager.CourseManager;
import javax.swing.JPanel;
import java.awt.Color;
import javax.swing.JTextField;
import java.awt.Rectangle;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
public class Delete_coursePanel extends JPanel {//删除科目
public Delete_coursePanel() {
try {
jbInit();
} catch (Exception exception) {
exception.printStackTrace();
}
}
private void jbInit() throws Exception {
this.setLayout(null);
this.setBackground(new Color(170, 178, 200));
tcno.setBounds(new Rectangle(78, 76, 130, 20));
jLabel1.setText("课程编号");
jLabel1.setBounds(new Rectangle(8, 81, 66, 15));
btn_delete.setBounds(new Rectangle(228, 72, 71, 23));
btn_delete.setText("删除");
btn_delete.addActionListener(new
Delete_coursePanel_btn_delete_actionAdapter(this));
btn_exit.setBounds(new Rectangle(320, 72, 69, 23));
btn_exit.setText("退出");
btn_exit.addActionListener(new
Delete_coursePanel_btn_exit_actionAdapter(this));
this.add(tcno);
this.add(jLabel1);
this.add(btn_delete);
this.add(btn_exit);
this.setVisible(true);//可见性
this.setSize(600, 600);//窗体大小
}
JTextField tcno = new JTextField();
JLabel jLabel1 = new JLabel();
JButton btn_delete = new JButton();
JButton btn_exit = new JButton();
public void btn_delete_actionPerformed(ActionEvent e) {
String cno = tcno.getText();//获得课程编码
CourseManager cm = new CourseManager();
int ok = JOptionPane.showConfirmDialog(this,
"是否删除" + tcno.getText() + "课程?
"提示信息
JOptionPane.OK_CANCEL_OPTION);
if (ok == JOptionPane.OK_OPTION) {
int i = cm.deleteCourse(cno);//调用删除课程信息方法
if (i > 0) {
JOptionPane.showMessageDialog(this, "删除成功!", "提示信息
JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(this, "你要删除的可程不存在!", "提示信息
JOptionPane.ERROR_MESSAGE);
tcno.setText("");
}
tcno.setText("");
}
}
public void btn_exit_actionPerformed(ActionEvent e) {
this.setVisible(false);
}
class Delete_coursePanel_btn_delete_actionAdapter implements ActionListener {
private Delete_coursePanel adaptee;
Delete_coursePanel_btn_delete_actionAdapter(Delete_coursePanel adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.btn_delete_actionPerformed(e);
}
}
}
class Delete_coursePanel_btn_exit_actionAdapter implements ActionListener {
private Delete_coursePanel adaptee;
Delete_coursePanel_btn_exit_actionAdapter(Delete_coursePanel adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.btn_exit_actionPerformed(e);
}
}
package sims.com.view;
import javax.swing.JPanel;
import java.awt.Color;
import javax.swing.JLabel;
import java.awt.Rectangle;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import sims.com.manager.CourseManager;
import sims.com.model.Course;
import javax.swing.JComboBox;
import java.util.Vector;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class Select_coursecnamePanel extends JPanel {//根据课程名称查询
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JTextField tctime = new JTextField();
JTextField tcno = new JTextField();
JTextField tcteacher = new JTextField();
JLabel jLabel3 = new JLabel();
JLabel jLabel4 = new JLabel();
JLabel jLabel5 = new JLabel();
JTextField tctype = new JTextField();
JTextField tcplace = new JTextField();
JLabel jLabel6 = new JLabel();
JButton btn_exit = new JButton();
JComboBox jcb_cname = new JComboBox();
CourseManager cm = new CourseManager();
private void jbInit() throws Exception {
this.setLayout(null);
this.setBackground(new Color(170, 178, 200));
jLabel1.setToolTipText("");
jLabel1.setText("授课教师");
jLabel1.setBounds(new Rectangle(18, 86, 53, 15));
jLabel2.setText("课程类别");
jLabel2.setBounds(new Rectangle(198, 87, 62, 15));
tctime.setEnabled(false);
tctime.setBounds(new Rectangle(265, 123, 77, 20));
tcno.setEnabled(false);
tcno.setBounds(new Rectangle(266, 40, 77, 20));
tcteacher.setEnabled(false);
tcteacher.setBounds(new Rectangle(91, 85, 93, 20));
jLabel3.setText("课程名称");
jLabel3.setBounds(new Rectangle(20, 45, 60, 15));
jLabel4.setText("课程编码");
jLabel4.setBounds(new Rectangle(193, 42, 65, 15));
jLabel5.setText("上课时间");
jLabel5.setBounds(new Rectangle(199, 124, 57, 15));
tctype.setEnabled(false);
tctype.setBounds(new Rectangle(265, 85, 77, 20));
tcplace.setEnabled(false);
tcplace.setBounds(new Rectangle(93, 123, 90, 20));
jLabel6.setText("上课地点");
jLabel6.setBounds(new Rectangle(19, 124, 67, 15));
btn_exit.setBounds(new Rectangle(22, 172, 81, 23));
btn_exit.setText("退出");
btn_exit.addActionListener(new
Select_coursePanel_btn_exit_actionAdapter(this));
jcb_cname.setBounds(new Rectangle(, 41, 97, 23));
jcb_cname.addItemListener(new
Select_coursecnamePanel_jcb_cname_itemAdapter(this));
this.add(jLabel2);
this.add(tctime);
this.add(tcteacher);
this.add(jLabel5);
this.add(tctype);
this.add(tcplace);
this.add(jLabel6);
this.add(tcno);
this.add(jLabel4);
this.add(jLabel3);
this.add(jLabel1);
this.add(jcb_cname);
this.add(btn_exit);
Vector v1 = cm.selectCourse();//调用查询所有课程名称方法
for (int i = 0; i < v1.size(); i++) {
jcb_cname.addItem(v1.get(i).toString());//将查询结果添加到下拉列表中
}
this.setVisible(true);
this.setSize(600, 600);
}
public Select_coursecnamePanel() {
try {
jbInit();
} catch (Exception exception) {
exception.printStackTrace();
}
}
public void btn_exit_actionPerformed(ActionEvent e) {
this.setVisible(false);
}
public void jcb_cname_itemStateChanged(ItemEvent e) {
//调用按课程名称查询课程信息
Course c = cm.findOneCourse(jcb_cname.getSelectedItem().toString());
tcno.setText(c.getCno());
tcteacher.setText(c.getCteacher());
tcplace.setText(c.getCplace());
tctype.setText(c.getCtype());
tcplace.setText(c.getCplace());
tctime.setText(c.getCtime());
}
}
class Select_coursecnamePanel_jcb_cname_itemAdapter implements ItemListener {
private Select_coursecnamePanel adaptee;
Select_coursecnamePanel_jcb_cname_itemAdapter(Select_coursecnamePanel
adaptee) {
this.adaptee = adaptee;
}
public void itemStateChanged(ItemEvent e) {
adaptee.jcb_cname_itemStateChanged(e);
}
}
class Select_coursePanel_btn_exit_actionAdapter implements ActionListener {
private Select_coursecnamePanel adaptee;
Select_coursePanel_btn_exit_actionAdapter(Select_coursecnamePanel adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.btn_exit_actionPerformed(e);
}
}
