https://www.bilibili.com/video/BV1n64y1N7et/
演示视频:
3.1 系统模块划分
根据高校教务评教的具体需求,将本系统划分为四个模块,分别为超级管理员模块、管理员模块、教师模块、学生模块。系统总体结构如图3.1所示。
图 3.1 系统模块结构图
其中,超级管理员拥有整个系统的最高权限,因而其功能也是最多的;教师模块可以进行学生管理,但这个模块下的学生管理权限比超级管理员下的学生管理要更小,教师只能管理自己所教授课程的学生,另外可以查看学生对自己的评分以及意见建议;管理员是指教务处的工作人员,他可以登录系统查看年有教师的评分情况,并可以进行汇总;学生模块是学生进行评教的入口,能对自己的任教教师进行评分并能查看已评结果。
3.2 各模块的需求分析
3.2.1 超级管理员需求分析
超级管理员帐号将分配给学校领导使用,其功能包括:添加院系信息、管理教师个人信息、管理学生信息以及查询修改管理员信息;安排教师的授课信息;查看评教结果;控制整个系统的登录功能,可以决定教师、管理员及学生是否可以登录系统。
首先,超级管理员需要登录后才能使用系统。用户登录管理模块对不同的用户角色都是统一的,在教务系统首页选择对应的角色,输入用户名、密码以及验证码即可以登录。超级管理员的用户由拥有数据库管理权限的DBA管理,其他人无法创建,保证了系统的安全性。超级管理员的用例图如图3.2所示。
图3.2 超级管理员用例图
超级管理员可以对院系、管理员、教师、学生的信息进行查询、添加、删除、修改操作,对评教结果可以做查询操作,另外,可以对其它所有角色进行权限管理,分配或收回其登录系统的权限,当某种用户角色被收回登录权限时,在主页登录页面的角色选择下拉框中,将会显示为不可用状态,无法选中。
3.2.2 管理员需求分析
本设计中的管理员对应现实中高校的教务处职工,他可对评教进行汇总工作,因此援于此类用户角色的权限是评教结果汇总,分别为班级汇总、课程汇总。用例图如3.3所示。
图3.3 管理员用例图
班级汇总是将每个班级的学生对每一门课程的任教教师的评分进行统计取平均分,生成如图3.4所示的报表。
图3.5 评教结果课程汇总
3.2.3 教师模块需求分析
教师登录系统后可以查看自己所教授课程的评分结果,并且可以对学生信息进行管理,教师模块中的学生信息管理与超级管理员模块中的学生信息管理的区别是,教师只能对选修了自己所任教的课程的学生进行管理,而超级管理可以对所有的学生进行管理。教师的用例图如图3.6所示。
图3.6 教师用例图
3.2.4 学生模块需求分析
学生模块的需求相对简单,分别为“查看我的评教”、“参与评教”,在查看评教页面中,可以分别看到已经评分的课程、尚未评分的课程与对应的任教老师,选择想要评分的课堂即可参与评教。评教页面中有5个指标,每个指标中有4个选项,对应不同的分值,总分为100;最后还有一项“意见与建议”,学生可以输入对任教老师的意见,教师则可以在相应的页面中看到。由于此模块功能较简单,所以不单独画用例图。
3.3 数据库设计
对评教系统的各个功能模块进行了需求分析之后,就应该着手设计数据库了。在进行此项工作时,借助了E-R图进行数据表的设计。根据前面的需求分析,本系统将创建10张表:超级管理员表(super_user)、教师表(teacher)、管理员表(admin)、学生表(student)、院系表(department)、班级表(class)、权限表(permission)、课程表(course)、选课表(student_course)、评分表(rating)。
数据表中的字段,主键均采用BIGINT类型,并设为自动增长(auto_increment);其它非整字型字段,除了“性别”外,均使用VARCHER类型以节省物理空间;“性别”字段使用CHAR类型并指定长度为1,其接收的值为‘M’或‘F’,添加检查约束。
数据表的E-R图如图3.7所示。其中,超级管理员表、管理员表、权限表是独立的,与其它表没有关联关系。教师表包含一个引用院系表的外键,与院系建立起N对1的关系;课程表引用了教师表的主键,建立起N对1的关系,即一个教师可以任教多门课程;学生表与院系表、班级表的关系均为N对1;班级表与院系表为1对N关系;选课表通过引用学生表与课程表的主键,建立起学生表与课程表的N对N关系,即选课表是一个关系表,本身并不存储实际数据;评分表引用了教师表、学生表、课程表三个表的主键,一条记录代表一个学生对一门课程的评分,每个学生只能对一门课程的教师评一次分,如果一个学生选修的课程中,有一门以上的课程是由同一名教师任教,那么将会对此教师评分多次,但对应不同的课程。
权限控制表只有一条记录,除主键外,其它三个字段分别代表管理员、教师、学生,字段数据类型为int,当其值为1时,表示该类型的用户拥有登录系统的权限;叵其值为0时,表示该类型的用户被禁止登录系统。每一次打开系统首页登录界面前,都会查询该表,确定哪些用户类型是有权限登录的,对于被禁止登录的用户类型,将把其对应的选项设为“不可用”。
图3.7 E-R图
4 系统详细设计
3.1 用户登录模块详细设计
本系统共有4类用户,提供了统一的登录界面,为了区别不同的用户类型,输入用户名及密码时,应选择对应的身份类型,当用户提交表单时,服务端程序会根据用户所选择的身份类型调用不同的DAO查询不同的数据表。由于前端界面、服务端业务逻辑都是一致的,因此,用户登录模块的详细设计将以超级管理员为例进行分析设计。
超级管理员的登录时序图如图3.1所示,当用户打开主页,选择用户身份并填写好用户名与密码后,向服务器提交表单,此时Sturst2将会根据用户的请求调用相应的
图3.1 超级管理员登录时序图
Action,Action将用户从前端发送过来的数据封装到相应的成员变量,然后调用业务层的方法。在登录模块,UserAction将会调用UserManageService类的suLogin方法,从DAO层根据超级管理员的用户名及密码进行查询,并返回查找到的超级管理员信息。UserAction会判断查找到的SuperUser对象,如果此对象为null,则说明刚才在DAO层中查找时,没有找到相应的记录(图3.8中第7步),此时给msg属性赋值“用户名或密码错误”并返回“ERROR”,Sturst2中配置ERROR字符串的返回值会转发到index.jsp,在此jsp中紧随着密码输入框有一个span标签,<span id="errorInfo" style="color:red;">${msg}</span>,因此登录错误时将可以显示错误信息,提示用户重新输入。而如果用户输入了正确的用户名及密码,则返回的SuperUser对象不为空,此时Action将其存放到Session中,以保证此后可以对该用户进行会话跟踪;然后返回字符串“suLogin”,让Strust2转向超级管理员主页,至此,登录成功。
3.2 院系信息管理模块详细设计
超级管理员拥有对院系信息的查询、新增、修改、删除的权限,院系管理的DAO层提供了对应的方法。添加新院系功能,在前端用html写一个表单,表单的name属性根据Strust2的标准,按“Action属性名.bean属性名”的规范,则可以被Strust2的拦截器注入相应的属性中。在Action中调用相应的业务层方法即可保存到数据库中,院系信息更新方法也是类似。
在前端jsp页面中,充分使用了ajax异步请求技术,达到了在整个操作过程中,原页面不会刷新,只对需要变化的节点进行更新。为了节省开发时间,避免将时间浪费在大量的业务无关性基础代码上,引入了jQuery框架,使用jQuery框架提供的load、$.get或$.post方法,可以根据业务需求快速实现ajax效果。
本模块中,院系删除功能使用ajax请求技术,发送想要删除的院系的ID号到服务器,服务器端的Action将会调用业务层的删除方法,若整个操作没有抛出异常,则说明操作成功,Action将status属性设为1代表操作成功,并让Strust2以json的形式把此传回浏览器,前端的JavaScript脚本将会删除页面上对应的记录;若服务端抛出异常,删除失败,我们则把status的值设为-1,代表删除失败,JavaScript则给出相应的提示,不对DOM节点做任何操作。
3.3 教师管理模块详细设计
教师管理模块由三项功能组成,分别为授课安排、评分统计、成员管理。
4.3.1 授课安排
此模块包含查看授课情况、解除授课课程、添加授课课程。当超级管理员点击“授课安排”时,将会使用Ajax方式加载当前所有教师的授课情况,显示在右边的主面板中。此表格如图3.2所示。
图3.2 授课安排信息表
点击每一行记录后面的“修改”将会进入修改授课信息页面,在此页面可以解除教师的当前任教的课程或添加新的任课课程。若要添加新的课程,将会发送请求到服务器,CourseDaoImpl类将会查找目前尚未安排有任教老师的课程,HQL语句:from Course as c where c.teacher is null,在jsp页面中显示出这些课程,超级管理员就可以选择让此教师任教哪门课程了。而解除授课信息,也是使用Ajax技术进行异步请求,其实现过程与删除院系信息类似。
4.3.2 评教统计
超级管理员可以查看评教结果,此模块将会显示所有课程及对应教师的评教结果(平均分),但是不提供汇总功能,评教汇总是管理员工作时使用的。因为查询评教平均分比较复杂,因此不使用HQL语言,而使用更加灵活的SQL语句,编写的SQL语句为:select t.real_name,course_name,avg(score) from rating r join course c on r.course=c.course_id join teacher t on r.teacher=t.teacher_id group by(r.course),因为在Hibernate中使用SQL,所以必须手动处理结果集,以返回一个List集合,此集合中的元素类型是String数组,第一个元素对应一条记录,处理结果集的代码及注释如下:
取得了评教结果集后,就可以在JSP页面中遍历并显示了。
4.3.3 教师成员管理详细设计
超级管理员可以对教师信息进行查找、添加、修改、删除操作,当点击“成员管理”时系统将查询所有的教师的基本信息供超级管理员查看,超级管理员可以对不同的教师进行修改或删除操作,或者添加新的教师信息。
由于使用传统的表单提交方式将会重新加载页面,而为了提高用户体验,添加新教师功能使用ajax方式提交表单,这样将可以统一操作界面。为了达到ajax表单提交方式,引入了jQuery的第三方插件jquery.form.js,这样即可省去繁杂的表单取值操作。以下是相应的JavaScript代码:
3.4 学生信息管理
4.4.1 添加学生信息
添加学生信息功能依然使用ajax方式提交表单,与添加教师信息功能一样,在此不再赘述,但此功能模块中,有一个关键的技术点:动态级联下拉菜单。添加学生信息的表单如图3.3所示。
图3.3 添加学生信息管理表单
在院系与班级两个下拉框中,班级下拉框的内容是根据院系的选择而动态改变的,要达到这个效果,必须给院系的下拉框添加一个监听事件,根据院系下拉框所选的选项,向服务端发送ajax请求,服务端则根据前端发过来的院系ID向数据库查找此院系下的所有班级信息,并以json形式返回给浏览器,此时再通过JavaScript将json解析生成新的option节点,清空原班级下拉框的option,然后把新的option集合插入班级下拉框。
在生成新增表单的JSP页面中,使用strust2的select标签,迭代出所有的院系,并添加onchange事件,调用fillClass()函数,传入院系的ID。
<s:select list="depts" listValue="deptName" listKey="deptId" οnchange=
"fillClass(this);" theme="simple" name="student.department.deptId"
headerKey="-1" headerValue="----请选择院系----"></s:select>
fillClass()函数将会使用ajax方式,发送院系ID并得到json形式的班级信息集合,然后添加到班级下拉框。
修改学生信息将发送学生的ID到服务端,从数据库查找该学生的所有信息并生成一个表单并填充原信息,超级管理员可以修改任意内容,不需要修改的则忽略。此表单的“所属院系”与“班级”与添加新学生信息的表单一样,都是动态级联的菜单,整个表单的提交依然使用jquery.form插件发送,若更新成功,则显示学生信息列表。
3.5 管理员信息管理详细设计
管理员是教务处的职工,可以使用本系统辅助其工作,但不具备对教师、学生的管理权限,因此该类型的用户相对简单,只有用户名及密码,所以管理起来也容易。添加新管理员,只需要输入用户名及密码即可,使用JavaScript的prompt函数弹出输入框,接收用户的输入值,然后使用ajax发送请求,若插入新记录成功,则把新的记录添加到管理员列表的末尾。具体实现:
修改管理员帐号与添加新帐号类似,都是通过对话框接收用户的输入信息,然后使用ajax提交。删除管理信息,使用ajax方式请求,若成功删除,则将对应的DOM节点移除。另外,还提供了重设密码功能,可以将用户的密码重设为默认的1234,使用ajax异步请求。所有操作,都会使用JavaScript立即更新DOM节点,不会刷新整个页面,保证用户的使用体验。
3.6 权限控制
权限控制的列表如图3.4所示,可以查看管理员、教师及学生的登录权限,点对
图 3.4 权限管理
应的“更改权限”,将会改变当前的登录权限。具体实现过程:每个类型的用户对应的操作,都有用户类型、当前权限值两个参数,发送给服务端后,将会调用DAO的相应方法,修改数据库记录,SQL语句分别为:update permission set admin_login=?,update permission set teacher_login=?,update permission set student_login=?。此功能使用ajax异步请求,若服务端操作成功,将会立即更新“登录权限”。
在请求主页时会查询权限表,主页JSP会判断各个用户类型是否具有登录权限,决定是否将其选项设为disabled,实现代码为:
实现效果如果3.5所示。
图3.5 登录权限
3.7 教师模块详细设计
教师模块包含学生信息管理与查看评教结果,其中学生信息管理功能与超级管理的学生信息管理功能一致,但权限不如超级管理员高,只能查看选修了自己任教的课程的学生信息,因此本功能的具体实现不再赘述。
评教结果功能,可以查看课程名称、评分人数、评分结果(平均分),要显示这些内容,需要查询评分表、教师表、课程表,具体的SQL语句为:select course_name,count(r.student),avg(score),r.course from rating r join teacher t on r.teacher=t.teacher_id join course c on r.course=c.course_id where t.teacher_id=:tid group by r.course,每一条记录还可以查看评教详情,可能看到每一个学生的评教部分以及意见建议,评教详情如图3.6。
出于保密性,评分详情里不包含学生真实姓名及学号。
3.8 管理员模块详细设计
管理用户是分配给教务处的职工使用的,提供评教汇总功能,分别有按课程汇总与按按班级汇总。
课程汇总的SQL语句为:select t.real_name,course_name,avg(score) from rating r join course c on r.course=c.course_id join teacher t on r.teacher=t.teacher_id group by(r.course),可以显示教师姓名、教授课程、评分结果。
班级汇总是指将每一个班级对不同课程任教老师的评价汇总得出平均分,因为每个专业可能有多个班级,都是同一个任教老师。
3.9 学生模块详细设计
此系统主要功能为教务评教,学生模块的功能为“参与评教”,可以查看尚未评教的课程、已经评教的课程以及分数,列表如图3.7所示。
图 3.7 参与评教
点击“评分”可以对相应的老师进行评教,评教指标共有5项,每项有4个级别,每项各20分共100分,另外,有一项“意见与建议”,可以让学生输入文字向教师提
图 3.8 评教表单
意见,如果学生提交了意见或建议,相应的教师可以在“评教详情”中查看。
4.10 系统的整体文件结构
根据以上的详细设计,将工程命名为jwmis,整个工程分为5个包,结构如图3.9所示。其中,biz包存放的是业务层的类;dao包存放数据访问类的接口,其下有一个子包impl,存放DAO接口的实现类;entity包则存放所有的实例类;web.action包里的是Action,隶属于控制层。
图 3.9 工程结构图
由于本系统使用了Strust2、Hibernate、Spring三个框架,因此必须有相应的配置文件,所有的配置文件将存放在config的源包下,其结构如图3.10所示。该源包有三
图 3.10 配置文件结构图
个目录,分别存放其名字对应的框架配置文件。
前端方面,为了安全起见,不能让用户直接请求jsp文件,因此所有的jsp文件都放入WEB-INF目录,此外,样式文件、脚本文件、图片等文件也放在相应的目录下,其结构如图3.11所示。错误页面等公有文件放在common目录下,样式文件存放在css目录下,图片则存放在images目录,脚本文件(js文件)存放在js目录,所有的jsp文件放在WEB-INF的jsp目录下,并以各个模块来命名子目录,存放该模块的jsp文件。Lib目录存放所有的jar包。
图 3.11 web应用目录结构