1 引言
成绩是学生学校生活的重要组成部分,也是衡量一个学生学习能力的重要标志,要方便的存储和查询学生成绩,随着信息化的发展,学院成绩管理系统就成为一个学校的网络组成不可或缺的部分。信息在社会和经济的发展中所起的作用越来越为人们所重视。计算机作为处理的工具,为适应数据处理需求的迅速提高,满足各类信息系统对数据管理的要求,在文件系统的基础上发展起了数据库系统。计算机数据库管理随着计算机硬件(尤其是外存储器)、软件技术和计算机应用范围的发展而不断发展。以前学院对学生的成绩是用人管理,而作为计算机应用的一部分,使用计算机对学生成绩进行信息管理,有着手工管理所无法比拟的优点,如:查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高学院对学生成绩管理的效率。因此,开发一套学院成绩管理系统是有必要的。本系统的编写目的在于对用户需求进行充分调研的基础上,深入理解并描述出系统的功能、性能、接口等方面的需求,研究学院成绩管理系统软件的开发途径和应用方法。
1.1 运行环境(软、硬件环境)
1.硬件环境:PC机-内存 16GB。
2.软件环境:操作系统-Windows11。
1.2 开发工具和编程语言
开发环境:Idea Ultimate Edition 2021.3.3。
数据库:MySQL5.7.24。
编程语言:Java。
2 系统需求描述
学院成绩管理系统中学生成绩管理是重要的一环,本系统旨在让学生、班级管理员、学院管理员可以从不同角度查看学生的成绩信息。同时学院管理员可以进行信息的录入。三种用户分别拥有相应的权限。
2.1用户角度需求分析
用户分为三种:普通学生、班级管理员和学院管理员。其中:班级学生可以查看自己已修课程的成绩,并且通过第几学期、课程是否通过、课程类别来组合查询自己的课程情况,下载自己成绩单。 班级管理员可以查看班级的总体成绩和班级学生的基本成绩信息,下载班级成绩单,以及进入自己所管理班级学生主页的权限。学院管理员可以通过Excel文件录入学生信息、课程信息、学生成绩信息,还可以录入学生项目信息和学生竞赛信息。可以查看各专业基本成绩信息,查看每班的基本成绩信息,查看每班各学科详细成绩。分专业下载成绩单。以及进入班级管理员主 页和学生主页的权限。
2. 2界面功能角度分析
- 登录界面:提供三个权限的用户登录。
- 注册界面:提供普通学生和班级管理员注册。
- 修改密码界面:提供普通学生和班级管理员修改密码。
- 学生界面:查看自己已修课程的成绩,通过第几学期、课程是否通过、课程类别来组合查询自己的课程情况。已修学分和剩余应修学分。下载成绩单。
- 班级管理员界面:查看班级基本信息,查看班级各个学生的基本成绩。下载成绩单。进入班级学生界面。
- 学院管理员界面:分专业查看专业基本信息,每个专业各班的基本成绩,查询班级各科成绩。通过 Excel 文件批量录入学生信息、课程信息、成绩信息。单个录入学生项目、竞赛情况信息。进入班级管理员界面。
3 系统设计
系统的功能都是围绕从不同角度查看学生成绩信息开发的。同时进行了不同用户权限的控制和数据插入数据库之前的校验。权限由低至高一共分为三层:班级学生、班级管理员、学院管理员。高级权限用户可享有较低级权限用户的所有服务。
3.1注册
在注册界面选择类别进行注册。普通学生选择班级学生,输入账号密码注册。班级管理员选择班级管理员,输入账号密码注册。学院管理员有默认账号,不提供注册服务。
错误提示及原因:
1) 学号不存在:学院管理员未导入此学号相关信息。
2) 学号已注册过:此学号已被注册。
3) 格式错误:账号、密码不和要求。
3.2登录
在登录界面选择类别进行登录。普通学生选择班级学生,输入账号密码登录。班级管理员选择班级管理员,输入账号密码登录。学院管理员选择任一个输入账号密码登录。类别选择错误会登录失败。
错误提示及原因:
1) 账号或密码错误:账号密码不匹配或类别选择错误。
2) 学号未注册:此学号未注册过。
3) 格式错误:账号、密码不和要求。
4) 班级不存在:当前系统中未查找到需要注册的班级的信息。
3.3修改密码
修改密码的进入方式为在学生界面和班级管理员界面点击右上角导航栏后选择修改密码一项进入。学院管理员不提供修改密码服务。
错误提示及原因:
1) 旧密码错误:输入的旧密码和当前用户的密码不一致。
2) 格式错误:旧密码、新密码格式不和要求。
3.4 我的主页
我的主页的进入方式为在自己主页点击右上角导航栏后选择我的主页一项进入。当前用户若跳转到其他页面时提供跳转至自己主页的服务。
3.5账号注销
账号注销的进入方式为在学生界面点击右上角导航栏后选择账号注销一项进入。用户一旦注销会删除他/她在本系统的所有信息。另外两类用户不提供注销服务。
3.6退出系统
退出系统的进入方式为在自己主页点击右上角导航栏后选择退出系统一项进入。用户一旦点击退出系统,会删除本次会话在服务器端保存的所有的信息。页面会自动跳转至登录界面
3.7学生主页
班级学生可从登录界面进入,班级管理员可以从班级管理员界面进入,学院管理员进入班级管理界面后再进入。 学生主页提供查看自己的基本成绩信息服务;由学期、类别、是否通过组合查询自己的成绩服务;已修学分、剩余应修学分服务;成绩单下载服务。
3.8班级管理员主页
班级管理员可从登录界面进入。学院管理员可从学院管理界面进入。该主页提供查看本班级的基本成绩信息服务;查看每个同学的基本成绩信息服务;成绩单下载服务。点击学号可进入班级成员主页。其中基本信息是整个班级的基本信息。各同学详细信息一项只能查看已注册过本系统的学生,无法查看到未注册的学生的详细成绩信息。
3.9学院管理员主页
学院管理员主页只能由学院管理员由登录界面进入。该主页分成三个子页面:计科页面、信安页面、信息录入页面。其中:
1)计科页面查看计科基本信息,计科各班级基本信息,计科某班级某课程详细信息。
2)信安页面查看信安基本信息,信安各班级基本信息,信安某班级某课程详细信息。
3)信息录入界面可以通过Excel文件批量录入学生信息、课程信息、成绩信息。可以逐个添加学生项目信息、学生竞赛信息。
说明:查看班级详细信息时只有存在选课记录的班级能被显示出来。无选课记录的班级不会显示。Excel文件只能是xlsx文件,不能是xls文件,成绩文件中的学号和课程号录入必须先于成绩文件。
数据导入的提示及原因:
1) 文件数据已导入:整个文件中的数据全部正确导入数据库。
2) 文件不为空:未选择文件就点击上传按钮。
3) 文件格式不允许!:上传的文件不是xlsx文档。
4) 数据导入失败:除以上三种原因的错误外,其他任何异常都会被归纳为“数据导入失败”。一般是由数据格式错误或者导入顺序不正确引起的问题。
3.10系统流程图解
图3.10系统流程图解
3.11核心功能图解
图3.11核心功能图解
4 数据库设计
4.1实体分析
1) 学生:学号、姓名、专业、班级、密码、GPA、级别;
2) 课程:课程号、课程名、类型、学分、重要系数;
3) 班级:班号;
4) 班级管理员:账号、密码、级别;
5) 竞赛:名称、年度;
6) 项目:名称、年度;
一个学生可以选多门课,一门课可以被多个学生选择,每次选课有成绩、选课号、学期、学年。一个班级有多个学生,每个学生只有一个班级。一个班级有一个管理员,一个管理员管理一个班级。一个项目可以有多个学生参与,一个学生可以参与多个项目,每次参与项目有级别、是否是负责人。一个竞赛可以被多个学生参与,一个学生可以参与多个竞赛,每次参与有奖项、是否是负责人。
4.2E-R图
图4.2E-R图
4.3关系模式
4.31学生表结构
字段名称 | 数据类型 | 可否为空 | 字段描述 | 其他说明 |
stu_id | char(12) | 否 | 学号 | |
stu_pwd | char(10) | 否 | 密码 | |
stu_name | nchar(5) | 否 | 姓名 | |
stu_major | nvarchar(10) | 否 | 专业 | |
stu_class | smallint | 否 | 班级 | |
stu_gpa | double(3,2) | 否 | GPA | |
stu_level | nchar(5) | 否 | 级别 |
4.32课程表结构
字段名称 | 数据类型 | 可否为空 | 字段描述 | 其他说明 |
cou_id | char(12) | 否 | 课程号 | |
cou_name | nchar(10) | 否 | 课程名 | |
cou_type | nchar(10) | 否 | 类型 | |
cou_factor | double(3,2) | 否 | 重要系数 | |
cou_credit | double(3,2) | 否 | 学分 | |
cou_year | year | 否 | 年度 |
4.33选课表结构
字段名称 | 数据类型 | 可否为空 | 字段描述 | 其他说明 |
cho_id | char(12) | 否 | 选课号 | |
stu_id | char(12) | 否 | 学生学号 | |
cou_id | char(12) | 否 | 课程号 | |
cho_grade | double(3,2) | 否 | 分数 | |
cho_year | year | 否 | 年度 | |
cho_term | char(5) | 否 | 学期 |
4.34班级管理员表结构
字段名称 | 数据类型 | 可否为空 | 字段描述 | 其他说明 |
man_id | char(12) | 否 | 账号 | |
man_password | char(10) | 否 | 密码 | |
man_classid | char(10) | 否 | 班号 | |
man_level | nchar(5) | 否 | 级别 |
4.35竞赛和项目表结构
字段名称 | 数据类型 | 可否为空 | 字段描述 | 其他说明 |
pro_id | char(12) | 否 | ID | |
pro_name | nchar(10) | 否 | 名称 | |
pro_year | year | 否 | 年度 | |
pro_award | nchar(10) | 否 | 奖项 | |
pro_level | nchar(5) | 否 | 级别 | |
pro_man | tinyint(1) | 否 | 是否是负责人 | |
stu_id | char(12) | 否 | 学号 | |
pro_type | nchar(10) | 否 | 类别 |
4.4视图
系统中一共建了四个视图,以其中一个举例说明。班级管理员界面可以看见自己所管理班级学生的基本成绩信息来自于视图classstudentscores。此视图是由学生表、课程表和选课表连接得到的。具体定义如下:
SELECT
`scores`.`stu_id` AS `id`,
`studentinfos`.`name` AS `name`,
`studentinfos`.`pwd` AS `pwd`,
`studentinfos`.`class` AS `class`,
`studentinfos`.`gpa` AS `gpa`,
sum(`courses`.`credit`) AS `allcre`,
`getStudentPassRate` (`scores`.`stu_id`) AS `passrate`
FROM(
(`studentinfos` JOIN `scores`)
JOIN `courses`
)
WHERE (
(
`studentinfos`.`id` = `scores`.`stu_id`
)
AND (
`scores`.`cou_id` = `courses`.`id`
)
AND (`scores`.`score` > 59)
)
GROUP BY
`scores`.`stu_id`
4.5触发器
系统中使用到一次触发器。在学院管理员录入学生成绩时,触发器根据新录入的学生成绩的系统中已有的学生选课成绩计算出录入之后的学生GPA。由于三种权限的用户都要使用GPA,所以此触发器处在整个系统的核心位置。定义如下:
BEGIN
DECLARE myavg DOUBLE;
DECLARE allcre DOUBLE;
DECLARE temp DOUBLE;
DECLARE sum DOUBLE DEFAULT 0.0;
DECLARE t INTEGER;
DECLARE t1 DOUBLE;
DECLARE t2 DOUBLE;
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT
scores.score, courses.coefficient, courses.credit
FROM studentinfos, scores, courses
WHERE studentinfos.id = scores.stu_id
AND scores.cou_id =
courses.id AND stu_id = new.stu_id;
DECLARE CONTINUE HANDLER FOR NOT found SET done = TRUE;
SELECT SUM(courses.credit) INTO allcre
FROM studentinfos, scores, courses
WHERE studentinfos.id = scores.stu_id AND scores.cou_id =
courses.id AND stu_id = new.stu_id AND score >= 60;
OPEN cur;
read_loop :
LOOP
FETCH cur INTO t, t1, t2;
IF done THEN LEAVE read_loop; END IF;
IF (t < 60) THEN
SET temp = 0.0;
END IF;
IF (t >= 60) THEN
SET temp = 1.0;
END IF;
IF (t >= 64) THEN
SET temp = 1.6;
END IF;
IF (t >= 66) THEN
SET temp = 1.7;
END IF;
IF (t >= 68) THEN
SET temp = 2.0;
END IF;
IF (t >= 72) THEN
SET temp = 2.3;
END IF;
IF (t >= 75) THEN
SET temp = 2.7;
END IF;IF (t >= 78) THEN
SET temp = 3.0;
END IF;
IF (t >= 82) THEN
SET temp = 3.3;
END IF;
IF (t >= 85) THEN
SET temp = 3.7;
END IF;
IF (t >= 90) THEN
SET temp = 4.0;
END IF;
SET sum = temp * t1 * t2 + sum;
END LOOP;
CLOSE cur;
SET myavg = sum / allcre;
UPDATE studentinfos SET gpa = myavg WHERE id = new.stu_id;
END
4.6.储存过程
系统使用到一次存储过程。在获得班级总体的GPA 时,使用了带输入输出参数的储存过程。参数:IN `classID` varchar(20),OUT `avgpa` double。定义如下:
BEGIN
DECLARE cgpa DOUBLE;
DECLARE sum DOUBLE DEFAULT 0.0;
DECLARE done int DEFAULT FALSE;
DECLARE num int;
DECLARE cur cursor for select gpa from
studentinfos where cclass = classID;
DECLARE CONTINUE HANDLER for not found set done = TRUE;
set sum=0.0;
set num=0;
open cur;
read_loop:LOOP
FETCH CUR INTO cgpa;
if done then leave read_loop; end if;
set sum = sum + cgpa;
set num = num+1;
end loop;
close cur;
set avgpa = sum/num;
SELECT sum,avgpa;
END
4.7游标
系统中使用到了两次游标及游标的循环。以触发器中的游标举例说明:
DECLARE cur cursor for SELECT
scores.score, courses.coefficient, courses.credit
from studentinfos, scores, courses
read_loop:loop
FETCH cur into t, t1, t2;
4.8函数
系统中共使用了6次函数。以获得班级挂科率函数举例说明:
参数:`classID` varchar(20);
返回类型:double
定义:
BEGIN
DECLARE sum DOUBLE;
DECLARE notPassSum DOUBLE;
select COUNT(*) into sum from scores,studentinfos where
scores.stu_id = studentinfos.id and studentinfos.cclass = classID;
select COUNT(*) into notPassSum from scores,studentinfos
where scores.stu_id = studentinfos.id and
studentinfos.cclass = classID and scores.score < 60;
if(sum = 0) THEN
return 0;
end if;
RETURN notPassSum/sum;
END
4.9索引
系统中除了Navicat自动添加的索引之外,使用到一次索引。在选课表中给成绩加上降序索引,因为后台获得的数据很多都是按成绩降序获得的。
定义:
create INDEX scoredesc on scores(score DESC);
图4.9索引
4.10关系完整性
1) 实体完整性:主键均不为空且不重复;
2) 域的完整性:成绩信息中的成绩、年度、学期默认值为 NULL。
3) 参照完整性:成绩信息中的学号参照学生信息中的学号,成绩信息中的课程号参照课程信息中的课程号,项目竞赛信息中的学号参照学生信息中的学号。删除和更新采取的操作都是级联。成绩表的完整定义如下:
CREATE TABLE `scores` (
`id` INT (20) NOT NULL AUTO_INCREMENT,
`stu_id` VARCHAR (20) NOT NULL,
`cou_id` VARCHAR (20) NOT NULL,
`score` INT (20) DEFAULT NULL,
`year` INT (20) DEFAULT NULL,
`term` INT (20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `cou_id` (`cou_id`),
KEY `stu_id` (`stu_id`),
KEY `scoredesc` (`score`),
CONSTRAINT `scores_ibfk_1` FOREIGN KEY (`cou_id`) REFERENCES
`courses` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `scores_ibfk_2` FOREIGN KEY (`stu_id`) REFERENCES
`studentinfos` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = INNODB AUTO_INCREMENT = 443 DEFAULT CHARSET = utf8
5 系统设计
数据库一端除了使用基本的增删查改,还使用到了视图、触发器、存储过程、游标、函数、索引等技术。但如索引等技术不能在后台代码中很好的体现出来。所以将能在后台中明显体现的技术列举如下。
例中的代码为Dao层的代码,即sql语句。事务的控制在Service层中。
①增加
系统中多次使用到了增加,以导入学生信息时的增加为例说明:
图5.1增加
②删除
系统中多次使用到了删除,以学生注销时的级联删除为例:
图5.2删除
③修改
系统中使用到的修改不多,以修改密码为例:
图5.3修改
④查找
系统中多次使用到了查找。以查询班级某课程详细信息为例:
图5.4查找
⑤调用函数
系统多次调用了函数,以获得班级挂科率为例:
图5.5调用函数
⑥调用存储过程
系统中使用到了一次存储过程,代码如下:
图5.6调用存储过程
⑦事务控制
系统中多次使用到了事务的控制,以增加成绩信息为例。
图5.7事务控制
说明:Transaction 是一个事务控制的类。beginTransaction()是用来开启事务的方法。rollback()事务回滚的方法。commit()是事务提交的方法。
6 总结
6.1大作业成果
该系统以Java Web技术为基础,实现了学院成绩管理的基本功能。学院管理员可以进行信息的录入,专业信息的查询。班级管理员可以进行班级信息的查询。学生可以进行自己成绩的查询。而且高权限用户兼有低权限用户的功能。除了功能的开发,对于非法访问也进行了处理,如低权限用户访问高权限用户页面等情况做了拦截处理。提高了系统的健壮性。
6.1不足及改进方法
系统的健壮性不够。尤其是在通过Excel文件导入数据的时候,对相应错误处理不够完善,用户只知道有问题,不知道到底哪里出了问题。没有使用Spring层框架,导致代码冗余情况较为严重。没有使用到高级查找如外链接的技术。改进方法为不通过Excel文件导入数据,通过csv文件导入数据更方便快捷,而且容错性较好。使用Spring框架减小代码冗余性。增加系统功能以使用到外链接的功能。
6.3收获
从数据库设计到程序编写,从后端到前端,都是我自己先学习再练习然后再到实践,每一步都是踏踏实实走过来的,真正的做到了“知行”。我从来没有想过它会对我帮助这么大。之前也曾接触过一些关于数据库的知识,但对它的理解也只是停留在文件存储上,以前自己写的很多程序也都只是打开一个txt进行读写而已,但是这次通过这一学期系统的学习,我再使用每一个软件的时候,我会惊叹到系统后面数据库强大的性能和编写人员优秀的能力。我自己在设计数据库时,一开始并没有考虑到数据的约束和规范,甚至觉得数据库很多余,很多东西我们用对象实现就可以搞定。但自己通过系统的学习,真心感叹数据库的伟大,它默默的在后端服务整个程序。通过本次数据库系统原理大作业掌握了基础的以Java为核心的网站开发技术,掌握了数据库的分析设计。并且综合应用了通过数据库系统原理课程所学的增删查改、视图、存储过程、游标、触发器、函数、关系完整性等知识到数据库系统大作业中,提升了自己的专业竞争力。