目录
前言
一、总体设计
1、知识背景
2、模块介绍(需求分析)
3、设计步骤
3.1 页面原型设计
3.2 前端页面开发
3.3 后端接口开发
3.4 数据库设计
二、详细设计
1、 系统功能模块划分
2、 数据流程图
3、数据库概念结构设计
4、 数据库逻辑结构设计
三、结果与分析
1、用户登录
2、人员管理
3、课程申请
4、课程审批
5、课程安排
6、选择课程
7、成绩评定
四、源码获取
总结
前言
这两个星期学校进行数据库的课程设计,我利用所学知识做出来了一个较为简单的教务管理系统,具体功能包括登录、人员管理、教师课程申请、管理员审批课程、管理员安排课程、学生选课、教师给学生评分等等。分享一下我的课程设计,记录一下自己的成长过程。( • ̀ω•́ )✧
《教务管理系统》项目演示
技术框架:前端采用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() | 是 | 申请时间 |
表5course_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) | 否 | 课程状态名称 |
表8course_switch选课的开启与关闭表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
course_switch_id | int | 否 | 主键自增 | |
status | int | 0 | 否 | 0表示选课关闭,1表示选课开启 |
表9department学院信息表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
department_id | int | 否 | 主键自增 | |
name | varchar(45) | 否 | 学院名称 |
表10 place上课地点信息表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
place_id | int | 否 | 主键自增 | |
name | varchar(45) | 否 | 上课地点名称 |
表11 operation用户操作信息表
字段名称 | 数据类型 | 默认值 | 是否可空 | 说明 |
operation_id | int | 否 | 主键自增 | |
name | varchar(30) | 否 | 用户操作名称 |
表12courses_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。最后,文章篇幅较长,感谢您能看到这里,博主水平有限,难免存在有不足的地方,欢迎各位大佬指出。让我们一起朝更好的方向努力前进吧!