目录
前言
这两个星期学校进行数据库的课程设计,我利用所学知识做出来了一个较为简单的教务管理系统,具体功能包括登录、人员管理、教师课程申请、管理员审批课程、管理员安排课程、学生选课、教师给学生评分等等。分享一下我的课程设计,记录一下自己的成长过程。( • ̀ω•́ )✧
《教务管理系统》项目演示
技术框架:前端采用Vue2,后端采用Spring,数据库使用MySQL。
一、总体设计
1、知识背景
本次课程设计我脱离了学校既定的GUI图形库操作,理由主要是JUI图形化操作较为繁琐,技术过于陈旧。而相较于图形化开发,Java语言更适合用来做后端服务的开发。因此,在本次课设中,我采用的是前后端分离开发模式,来实现业务所需要的功能。
首先,前端即用来写用户看的到的界面的部分,我采用的是Vue框架携同Element组件库进行快速开发,所需要的前置知识有Html、Css、JavaScript、Node.js。后端即用来处理数据和逻辑操作的部分,我采用的是Java语言主流的Spring框架,利用Meaven进行jar包的管理,Mybatis操作数据库,采用SpringMVC进行开发。
在数据库层面,采用的是MySQL数据库,该数据库免费使用,应用范围较为广泛。在表结构设计上面,采用MySQL自带的MySQL WorkBench进行图形化的操作。
2、模块介绍(需求分析)
系统主要有以下几大模块:用户登录、人员管理、课程申请、课程审批、课程安排、课程选课、成绩评定。
- 用户登录:根据角色权限的不同,用户分为管理员、学生和教师三类,不同用户输入账号和密码登录后所看到的界面不一样。用户登录之后若不选择退出登录,下次输入网址的时候能直接跳转至首页,无需再次输入账号和密码。此外,用户登录后经过一段时间,网站将提示登录超时,相应页面将不能访问,这时候用户需要重新登录。登录成功之后,用户可以选择修改自己的密码。
- 人员管理:该模块包含两大管理,一是学生管理,二是教师管理,两者功能类似,主要有根据条件对用户进行查询,批量删除人员,新增一名人员,修改一名人员的信息,前端分页和后端分页。
- 课程申请:教师角色可以选择向管理员提交申请,新增一门课程。申请之后,教师可以看到自己的提交记录以及相应的提交状态(待审批、已通过、未通过),点击相应的记录可以查看自己的提交详情。
- 课程审批:管理员可以查看教师的课程申请记录,并进行相应的处理,可以选择通过,也可以选择不通过。当选择通过时,教师的申请记录的提交状态将转变为已通过,此时,该课程将添加进课程安排的页面,并处于等待课程安排的状态;当选择不通过时,教师的申请记录的提交状态将转变为未通过,课程将不会添加进课程安排的页面。
- 课程安排:管理员可以对通过了审批的课程进行排课,也可以自己新增一门课程,此时,课程将处于待选状态。管理员可以选择开启选课,开启后,所有待选状态的课程将变为可选,学生将在选课中心看到这些课程;关闭选课,可选状态的课程将转变为授课中的状态,教师正式进入课程的授课。当某一课程结束后,管理员可以点击结课按钮,该课程转变为结课状态,此时教师可对选了该门课的学生进行评分。管理员可以删除处在待选状态或等待课程安排状态的课程信息。
- 课程选课:当管理员开启选课后,学生可以看到选课中心的课程内容,根据自己的爱好进行课程的选择,选择后若是不满意,也可以选择退课。处在授课中或者已结课的课程不支持退课。
- 成绩评定:教师可以在其课程中查看课程详情,查看选修了该门课的所有学生基本信息,当课程处于已结课状态后,教师可以对学生进行评分,学生也能在其课程中看到最后的成绩。若课程未处于已结课的状态,教师将不能对学生进行评分。
3、设计步骤
3.1 页面原型设计
在正式进行开发之前,需要将具体的页面设计好,这样前端能根据页面进行开发,后端也能根据页面设计出合适的接口,常用的原型设计工具有Axure和墨刀。在这里,由于我是一个人进行工作,且课设时间较为紧迫,因此页面原型我在脑海里面过了一遍,就没有用工具绘制出来了。
3.2 前端页面开发
根据原型,利用Html、Css、JavaScript配合Vue2进行页面的开发。本次开发所采用的UI组件库难免与原型不太一样,因此前端页面的制作大致符合原型的样子即可。
3.3 后端接口开发
根据页面的大致情况,需要设计出合适的接口,接受前端传递过来的请求,如根据学生的id获取学生的信息就适合采用GET请求,而新增一名学生就适合采用POST请求。接口开发完成,与前端正式交互之前,需要先进行接口测试,所采用的测试工具为Postman,以保证接口所传数据的准确性。
3.4 数据库设计
根据模块的功能以及页面的情况,利用所学的数据库知识设计出相应的表结构,通过Java程序连接好数据库,将数据返回给前端显示。
二、详细设计
1、 系统功能模块划分
该系统是多角色登录的系统,不同的角色进行登录,所拥有的权限不同。管理员主要是对人员进行管理,课程进行审批,安排教学工作;教师主要是申请课程和给学生评分;学生主要是进行课程的选择,查看最后的成绩。
2、 数据流程图
数据的流通从登录开始,登录后,用户可以选择退出登录或者修改密码。数据流程中,较为复杂的主要是课程的申请与审批,以及教学任务的安排工作。在课程正式进入到选课前,需要进行课程的安排,使课程处于待选状态。开启选课后,所有待选状态的课程将转变为可选,关闭选课后,可选课程进入授课状态。只有当课程结课之后才能对学生进行成绩的评定。
3、数据库概念结构设计
通过对模块和数据流程的分析,我们需要有学生信息、教师信息、申请信息、审批信息、课程信息、管理员信息、选课信息、课程状态信息、是否开启选课等多种数据。各种数据之间存在一定的联系,如学生与选课之间的关系是多对多的,学院与学生之前的关系是一对多的。
4、 数据库逻辑结构设计
通过分析,我总共设计了12个数据表格,分别为管理员信息表、教师信息表、学生信息表、课程申请表、课程审批表、课程信息表、课程状态表、选课的开启与关闭表、学院信息表、上课地点信息表、用户操作信息表和学生选课关系表。
表1 administrator 管理员信息表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
administrator_id | int | 否 | 主键自增 | |
name | varchar(45) | 否 | 姓名 | |
account | varchar(45) | 否 | 账号 | |
password | varchar(45) | 否 | 密码 |
表2 teacher教师信息表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
teacher_id | int | 否 | 主键自增 | |
name | varchar(45) | 否 | 姓名 | |
teacher_number | varchar(45) | 否 | 工号/账号 | |
department_id | int | 否 | 外键学院id | |
date_time | datetime | now() | 否 | 最后操作时间 |
password | varchar(45) | 123456 | 否 | 密码 |
表3 student学生信息表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
student_id | int | 否 | 主键自增 | |
name | varchar(45) | 否 | 姓名 | |
student_number | varchar(45) | 否 | 学号/账号 | |
stduent_class | varchar(45) | 否 | 学生班级 | |
date_time | datetime | now() | 否 | 最后操作时间 |
password | varchar(45) | 123456 | 否 | 密码 |
表4 course_application课程申请表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
course_application_id | int | 否 | 主键自增 | |
teacher_id | int | 是 | 外键教师id | |
course_id | int | 是 | 外键课程id | |
course_name | varchar(45) | 是 | 课程名称 | |
course_credit | varchar(5) | 是 | 课程学分 | |
course_hour | varchar(5) | 是 | 课程学时 | |
course_time | varchar(45) | 是 | 上课时间 | |
course_place_id | int | 是 | 外键上课地点id | |
course_description | text | 是 | 课程描述 | |
course_examination_id | int | 否 | 外键课程审批id | |
operation_id | int | 否 | 外键操作id | |
date_time | datetime | now() | 是 | 申请时间 |
表5 course_examination课程审批表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
course_examination_id | int | 否 | 主键自增 | |
name | varchar(45) | 否 | 审批的名称 |
表6 course课程信息表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
course_id | int | 否 | 主键自增 | |
name | varchar(45) | 是 | 课程名称 | |
teachaer_id | int | 是 | 外键教师id | |
credit | varchar(45) | 是 | 学分 | |
hour | varchar(20) | 是 | 学时 | |
time | varchar(45) | 是 | 上课时间 | |
Place_id | int | 是 | 外键上课地点id | |
description | text | 是 | 课程描述 | |
course_status_id | int | 否 | 外键课程状态id | |
is_delete | Int | 0 | 否 | 是否删除,0表示没有,1表示已删除 |
表7 course_status课程状态表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
course_status_id | int | 否 | 主键自增 | |
name | varchar(45) | 否 | 课程状态名称 |
表8 course_switch选课的开启与关闭表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
course_switch_id | int | 否 | 主键自增 | |
status | int | 0 | 否 | 0表示选课关闭,1表示选课开启 |
表9 department学院信息表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
department_id | int | 否 | 主键自增 | |
name | varchar(45) | 否 | 学院名称 |
表10 place上课地点信息表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
place_id | int | 否 | 主键自增 | |
name | varchar(45) | 否 | 上课地点名称 |
表11 operation用户操作信息表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
operation_id | int | 否 | 主键自增 | |
name | varchar(30) | 否 | 用户操作名称 |
表12 courses_students学生选课关系表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
courses_students_id | int | 否 | 主键自增 | |
course_id | int | 否 | 课程id | |
student_id | int | 否 | 学生id | |
score | float | 是 | 成绩 |
三、结果与分析
系统实现了用户登录、人员管理、课程申请、课程审批、课程安排、选择课程、成绩评定等模块。自我感觉这次所写的代码量比较庞大,有些细节的地方可能没有太注意。为了实现这个系统,我稍微统计了一下,后端写了37个接口,前后端代码加起来应该有几千行了。
后端采了用MVC进行分层,其中,Controller层用来定义接口并返回结果,Service层用来处理相应的逻辑,Mapper层用来进行数据库的操作。各个模块分离开来,采用bean来进行管理,尽量保证了代码的高内聚、低耦合。前端为不同的功能模块定义了不同的文件夹,如与组件有关的就单独放在一个组件文件夹中,以保证代码的层次性与整洁性。
1、用户登录
用户登录整体上是采用的JWT令牌登录的技术,前端将用户的账号、密码和身份信息传入到后端之后,后端根据用户的身份信息在相应的数据表格中查询用户的信息,若查不到,则不允许用户登录;若查到用户,则将查到的用户的id、姓名和身份封装起来,转换为JWT令牌返回给前端。接下来,前端将这一令牌存储在浏览器的localStorage中,接下来前端每次请求时都将浏览器本地存储的这一信息取出来,在请求头中携带,后端则在每一次请求的时候校验这一信息。若这一信息变更或者登陆超时,则提示用户重新登录。若用户没有登录,则在前端访问不到相应的网址,也访问不到后端相应的接口信息。在这一过程中,为了防止代码的重复化,后端的拦截器和前端的拦截器就显得尤为重要,与登录相关的逻辑主要是在拦截器中进行处理。
后端与登录有关的部分代码:
前端与登录有关的部分代码如下:
2、人员管理
管理员登录系统之后,可以对学生和教师进行增删改查操作,以及数据发分页显示。在这个过程中,需要实现的接口有根据人员id查询人员的信息,根据用户输入的条件分页查询人员的信息,根据人员的id修改人员的信息,根据人员的id数组批量删除人员的信息。
3、课程申请
当教师登录该系统后,教师填写相应的申请信息后,可以进行课程的申请。申请提交后,将在数据库生成一条关于该教师的申请记录,此时课程申请处于待审批的状态,教师可以查看自己的申请记录以及申请详情。管理员同意申请时,会根据教师的申请生成一门课程数据,申请状态由待审批转变为已通过;管理员不通过时,不会生成一门课程数据,申请状态会油待审批转变为未通过。
4、课程审批
管理员可以对教师申请的课程信息进行审批,若觉得合适,则可以选择通过,若觉得不合适,则可以不通过教师的申请。审批界面与申请界面类似,这里展示一下与审批有关的部分前后端代码:
5、课程安排
管理员可以对通过审批的课程进行排课,也可以自己新增一门新的课程,并将该课程的授课任务安排给一位老师。当需要排课的课程全部排课后,可以开启选课,让学生进行选课。当学生选完课后,管理员可以关闭选课,课程进入授课中的状态,学生将不能再选课,也不能选择退课。此时,教师可以查看选择了该门课程的所有学生的基本信息,但是不能对学生进行成绩的评分。
6、选择课程
教师开启选课后,学生可以在选课中心查看可选的课程,并选择相应的课程。选择相应的课程后,学生可以在我的课程界面查看已经选择的课程。如果课程没有处于授课中或者结课的状态,则可以退课。
7、成绩评定
课程结课后,教师可以根据学生的表现,对学生进行评分。评分后,学生也可以在我的课程界面看到最后的成绩。若课程没有结课,成绩无法进行排评定。
四、源码获取
该系统的源码已经上传至百度网盘,链接和提取码如下:
教务管理系统: 教务管理系统.zip_免费高速下载|百度网盘-分享无限制 (baidu.com)
提取码:6p1w
总结
总体来说,这次课程设计的代码量还是有点多的,一些细节的地方没有做的足够完善,比如说添加数据时的校验,系统可能存在一些还没有发现的bug。最后,文章篇幅较长,感谢您能看到这里,博主水平有限,难免存在有不足的地方,欢迎各位大佬指出。让我们一起朝更好的方向努力前进吧!