20230601_Java 2 Platform Enterprise Edition test work
一、项目背景
学生选课系统作为高等院校管理学生动态选课信息的基本手段,起到了学生工作的加强管理。学生选课系统由高校在校生以及高校教师使用,并且收获众多好评。从高校学生的角度出发,学校进行教学制度改革,全国的大部分高校逐步推广在校的学生自由选课,以前传统的由高校教务管理部门排课这种方式逐渐不能适应时代的发展,即不符合以人为本的教学特点,也不能适应新的教学方式。由教务统计课时,安排教师授课,发放纸质授课申请表,再回收申请表,然后再进行纸质排课,推出课程表,这一过程对人力、物力资源的浪费显而易见。这仅仅只是其中一个方面,另一方面由于人为统计,数据难免出错,经常出现例如多门课一个教室或者一个教师同一时段授课两个班等等情况。高校发展至今,陈旧的排课模式弊端日益显现。所以我们可以采取新型的方式,也就是网络信息自动化的方式,让学生根据培养方案,结合自己的兴趣自主选课,提高工作效率,节省时间成本,降低出错概率。本项目正是结合目前学生选课管理的实际情况,首先介绍学生选课系统的研究背景、研究的意义进行阐述;再通过功能分析,分点分模块进行功能设计;之后再在已有功能的基础上进行程序设计,产出成果;最后通过对整体项目的测试,使得项目更具有鲁棒性和说服力。本项目主要分为三个模块,分别是:学生信息模块、教师信息模块和管理员模块,管理员可以对系统进行增、删、改、查等操作,教师主要可以查看获取他所教授的课程列表,学生则是可以进行退补选课程等。
二、关键技术
1、数据库
数据库是一种组织和管理数据的工具,它具有以下特点:首先,数据结构化是它最大的特点,数据库将数据组织成结构化的表格或关系型数据模型,使得数据可以被高效地检索和存储。数据集中存储,数据库将数据集中存储,以避免数据冗余和数据不一致的问题。数据安全性也同样重要,数据库提供了数据安全性控制,以确保只有授权用户可以访问数据库中的数据。其次,数据库具有数据可维护性,数据库提供了数据维护功能,例如数据备份、数据恢复和数据重构等。再次,数据库具有数据可扩展性的特点,数据库可以轻松地扩展其容量和性能,以应对数据量的增长和用户的需求变化。再次,数据一致性也是它的重要特点,数据库必须确保数据的一致性,以确保数据的一致性和可用性。最后,数据库具有数据可访问性,数据库必须确保数据的可访问性,以确保数据的及时性和高效性。总的来说,数据库是一种高效、安全、可维护、可扩展、一致性高和可访问性好的数据管理工具,适合用于管理各种类型的数据。
2、JSP
它是一种用于创建动态网页的 Java 技术,同时它有很多优点。首先,它可以动态生成网页,JSP 允许将动态数据 (如用户输入或从数据库检索的数据) 嵌入到网页中,从而动态生成网页。这使得 JSP 成为创建动态网页的理想技术。其次,它拥有易于学习和使用的特点,JSP 是一种相对简单的 Java 技术,它不需要像 Java Servlet 那样掌握复杂的 Servlet API。因此,对于 Java 新手来说,JSP 是一种更容易学习的 Java 技术。再次,快速开发也是它的优势,JSP 具有快速开发的优点,因为它只需要几分钟就能创建一个新的 JSP 页面。与 Java Servlet 相比, JSP 的开发速度更快,因为它不需要处理 HTTP 请求和处理数据的逻辑。JSP 支持跨平台,它可以在不同的操作系统上运行,包括 Windows、Linux 和 Mac OS 等。这使得 JSP 成为一种跨平台的 Web 开发技术。最后,它拥有庞大的开发社区,JSP 拥有一个庞大的开发社区,这意味着有很多开源的 JSP 框架、库和工具可供使用,可以极大地提高开发效率和质量。总的来说,JSP 是一种简单、快速、灵活和强大的 Web 开发技术,适合用于创建动态网页和 Web 应用程序。
3、中文乱码问题
数据库统一采用 utf-8 编码方式,防止不必要的乱码。
4、Java语言
Java 是一种广泛使用的编程语言,它具有跨平台性,Java 代码可以被编译成字节码,然后在 Java 虚拟机 (JVM) 上运行,这使得 Java 代码可以在任何支持 JVM 的操作系统上运行。安全性,Java 是一种安全的语言,因为它有许多安全特性,例如内置的安全管理器和安全沙箱。java简单易学,Java 是一种相对简单的编程语言,它拥有简单的语法和易于理解的数据类型。Java 是一种面向对象的语言,它支持类、继承、多态等面向对象的特性,同时它提供了内置的多线程支持,使得编写并发程序变得容易。Java 拥有许多强大的框架和库,例如 Spring、Hibernate、Maven 等,可以大大提高开发效率和质量。Java 拥有大量的开源库,这些库可以极大地提高开发效率和质量,例如 Apache Commons、Guava 等。总的来说,Java 是一种强大、跨平台、安全、简单易学、面向对象、多线程支持和拥有大量开源库的编程语言,适合用于开发各种类型的应用程序。
5、WEB分页技术
WEB 分页技术是指将 Web 页面的内容分成多个部分,以便更好地展示和传输。动态分页,动态分页是一种通过 JavaScript 动态生成页面的技术。在动态分页中,每当用户请求一个新的页面时,JavaScript 代码会重新生成页面的内容,并将新的页面加载到网页上。
6、其他
编译器:IntelliJ IDEA
项目构建工具:Maven
数据库:MySQL
JDK版本:JDK 1.8
Tomcat版本:Tomcat 8.x
三、系统架构
1、系统总体层次
1)学生选课管理系统
分为“3+1”模块,分别是:登录模块、学生信息模块、教师信息模块、管理员模块。该系统的功能层次图,如图1所示:
2)数据库
总表,如表1所示:
3)ER图
在数据库总表的基础上绘制ER图,如图2所示:
2、登录模块
1)管理员、学生、教师
三者的角色ID以及名称,见表2所示:
管理员、学生、教师三者的角色ID以及名称的ER图,如图3所示:
2)登陆界面
用户名和密码汇总表,见表3所示:
登陆界面的用户名和密码的ER图,如图4所示:
3、学生信息模块
学生信息模块主要存放学生的基本信息,例如:毕业年份、入学年级、性别、学生姓名以及学号等信息。
4、教师信息模块
5、管理员模块
1)院系编号与课程名称维护:
2)课程信息维护:
3)课程和教师、学生编号维护:
6、系统框架结构
系统的整体框架结构如图10所示,绘制类图:
role、uerlogin、college、selectedcourse为基础类,course中存放所有和课程有关的属性,teacher为教师所属类,负责教师的一切动作,student是学生类,里面包含学生的动作汇总。
四、核心代码
1、登录模块
初始化项目,是学生选课信息管理系统的“门面”。内置用户ID登录和密码输入两项输入框。输入管理员账号则登录到管理员界面,输入学生账号则登录到学生选课界面。管理员账户为:admin,密码为:123;教师账户一般为教师工号,密码默认为123;学生账户一般为学号,密码默认为123。如图11所示:
关键代码:
<div class="container" id="content">
<div class="row">
<jsp:include page="menu.jsp"></jsp:include>
<div class="col-md-10">
<div class="panel panel-default">
<div class="panel-heading">
<div class="row">
<h1 style="text-align: center;">重置其他用户密码</h1>
</div>
</div>
<div class="panel-body">
<form class="form-horizontal" name="reset" role="form" action="/admin/userPasswordRest" id="editfrom" method="post" onsubmit="return check()">
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">账号(非管理员账号)</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="username" id="inputEmail3" placeholder="请输入用户名">
</div>
</div>
<div class="form-group">
<label for="inputPassword3" class="col-sm-2 control-label">密码</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="inputPassword3" placeholder="请输入密码" name="password">
</div>
</div>
<div class="form-group">
<label for="inputPassword3" class="col-sm-2 control-label">确认密码</label>
<div class="col-sm-10">
<input type="password" class="form-control" name="password2" id="inputPassword3" placeholder="请再次输入密码">
</div>
</div>
<div class="form-group" style="text-align: center">
<button class="btn btn-default" type="submit">提交</button>
<button class="btn btn-default">重置</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
2、管理员模块
1)学生名单管理模块
可以对学生名单进行增、删、改、查等操作,如图12所示:
点击进入内部之后,可以做修改学生信息的操作。其中所有属性均可修改,包含学生的姓名、性别、出生日期、入学时间、所属院系等。如图13所示:
关键代码:
<div class="panel-heading">
<div class="row">
<h1 class="col-md-5">学生名单管理</h1>
<form class="bs-example bs-example-form col-md-5" role="form" style="margin: 20px 0 10px 0;" action="/admin/selectStudent" id="form1" method="post">
<div class="input-group">
<input type="text" class="form-control" placeholder="请输入姓名" name="findByName">
<span class="input-group-addon btn" id="sub">搜索</span>
</div>
</form>
<button class="btn btn-default col-md-2" style="margin-top: 20px" onClick="location.href='/admin/addStudent'">
添加用户信息
<sapn class="glyphicon glyphicon-plus"/>
</button>
</div>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>学号</th>
<th>姓名</th>
<th>性别</th>
<th>出生年份</th>
<th>入学时间</th>
<th>学院</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${studentList}" var="item">
<tr>
<td>${item.userid}</td>
<td>${item.username}</td>
<td>${item.sex}</td>
<td><fmt:formatDate value="${item.birthyear}" dateStyle="medium" /></td>
<td><fmt:formatDate value="${item.grade}" dateStyle="medium" /></td>
<td>${item.collegeName}</td>
<td>
<button class="btn btn-default btn-xs btn-info" onClick="location.href='/admin/editStudent?id=${item.userid}'">修改</button>
<button class="btn btn-default btn-xs btn-danger btn-primary" onClick="location.href='/admin/removeStudent?id=${item.userid}'">删除</button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
2)课程名单管理模块
这个模块主要功能是对所有课程的课程名单进行管理维护,管理员可以进行增、删、改、查等操作。如图14所示:
关键代码:
<div class="panel panel-default">
<div class="panel-heading">
<div class="row">
<h1 class="col-md-5">课程名单管理</h1>
<form class="bs-example bs-example-form col-md-5" role="form" style="margin: 20px 0 10px 0;" action="/admin/selectCourse" id="form1" method="post">
<div class="input-group">
<input type="text" class="form-control" placeholder="请输入姓名" name="findByName">
<span class="input-group-addon btn" onclick="document.getElementById('form1').submit" id="sub">搜索</span>
</div>
</form>
<button class="btn btn-default col-md-2" style="margin-top: 20px" onClick="location.href='/admin/addCourse'">
添加课程信息
<sapn class="glyphicon glyphicon-plus"/>
</button>
</div>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>课程号</th>
<th>课程名称</th>
<th>授课老师编号</th>
<th>上课时间</th>
<th>上课地点</th>
<th>周数</th>
<th>课程类型</th>
<th>学分</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${courseList}" var="item">
<tr>
<td>${item.courseid}</td>
<td>${item.coursename}</td>
<td>${item.teacherid}</td>
<td>${item.coursetime}</td>
<td>${item.classroom}</td>
<td>${item.courseweek}</td>
<td>${item.coursetype}</td>
<td>${item.score}</td>
<td>
<button class="btn btn-default btn-xs btn-info" onClick="location.href='/admin/editCourse?id=${item.courseid}'">修改</button>
<button class="btn btn-default btn-xs btn-danger btn-primary" onClick="location.href='/admin/removeCourse?id=${item.courseid}'">删除</button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
3、教师模块
1)教授课程模块
当教师登陆后,该教师可以获取他(她)所教授的全部课程列表信息,并且可以对已经考完试的科目进行打分,评阅完毕分数后点击提交,即可将该名学生的成绩公示,学生端即可查询到自己的成绩。如图15所示:
关键代码:
<div class="panel-heading">
<div class="row">
<h1 class="col-md-5">我教授的课程</h1>
<form class="bs-example bs-example-form col-md-5" role="form" style="margin: 20px 0 10px 0;" action="/admin/selectCourse" id="form1" method="post">
<div class="input-group">
<input type="text" class="form-control" placeholder="请输入课程名" name="findByName">
<span class="input-group-addon btn" onclick="document.getElementById('form1').submit" id="sub">搜索</span>
</div>
</form>
</div>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>课程号</th>
<th>课程名称</th>
<th>授课老师编号</th>
<th>上课时间</th>
<th>上课地点</th>
<th>周数</th>
<th>课程类型</th>
<th>学分</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${courseList}" var="item">
<tr>
<td>${item.courseid}</td>
<td>${item.coursename}</td>
<td>${item.teacherid}</td>
<td>${item.coursetime}</td>
<td>${item.classroom}</td>
<td>${item.courseweek}</td>
<td>${item.coursetype}</td>
<td>${item.score}</td>
<td>
<button class="btn btn-default btn-xs btn-info" onClick="location.href='/teacher/gradeCourse?id=${item.courseid}'">成绩</button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
2)教师赋分模块
在已选课程名单,教师可以对选择该门课程的学生成绩进行赋分操作,已赋分的成绩显示“已打分”,未赋分的成绩显示“打分”。如图16所示:
关键代码:
<div class="panel-heading">
<div class="row">
<h1 class="col-md-5">已选该课程学生名单</h1>
</div>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>学号</th>
<th>姓名</th>
<th>分数</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${selectedCourseList}" var="item">
<tr>
<td>${item.studentCustom.userid}</td>
<td>${item.studentCustom.username}</td>
<c:if test="${!item.over}">
<td>未打分</td>
<td>
<button class="btn btn-default btn-xs btn-info" onClick="location.href='/teacher/mark?studentid=${item.studentid}&courseid=${item.courseid}'">打分</button>
</td>
</c:if>
<c:if test="${item.over}">
<td>${item.mark}</td>
<td>已打分</td>
</c:if>
</tr>
</c:forEach>
</tbody>
</table>
4、学生模块
1)课程列表模块
该模块主要功能是使学生登陆后,可以获取可选课程的课程列表,学生可以根据自己的需要任意选择,模块中显示课程号、课程名称、指导教师编号、上课时间、课时数、课程类型等属性,简洁直观,方便同学根据自己的兴趣随意搭配选择,同时右上角还配有搜索功能,当刷新的课程数量较多时。可以通过搜索课程名称等信息对课程进行快速查找,更加方便。如图17所示:
关键代码:
<div class="panel-heading">
<div class="row">
<h1 class="col-md-5">课程列表</h1>
<form class="bs-example bs-example-form col-md-5" role="form" style="margin: 20px 0 10px 0;" action="/admin/selectCourse" id="form1" method="post">
<div class="input-group">
<input type="text" class="form-control" placeholder="请输入课程名" name="findByName">
<span class="input-group-addon btn" onclick="document.getElementById('form1').submit" id="sub">搜索</span>
</div>
</form>
</div>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>课程号</th>
<th>课程名称</th>
<th>授课老师编号</th>
<th>上课时间</th>
<th>上课地点</th>
<th>周数</th>
<th>课程类型</th>
<th>学分</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${courseList}" var="item">
<tr>
<td>${item.courseid}</td>
<td>${item.coursename}</td>
<td>${item.teacherid}</td>
<td>${item.coursetime}</td>
<td>${item.classroom}</td>
<td>${item.courseweek}</td>
<td>${item.coursetype}</td>
<td>${item.score}</td>
<td>
<button class="btn btn-default btn-xs btn-info" onClick="location.href='/student/stuSelectedCourse?id=${item.courseid}'">选课</button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
2)已选课程模块
这个模块可以直观地反应出学生已选课程列表。如图18所示:
关键代码:
<div class="panel-heading">
<div class="row">
<h1 class="col-md-5">已选课程</h1>
</div>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>课程号</th>
<th>课程名称</th>
<th>授课老师编号</th>
<th>上课时间</th>
<th>上课地点</th>
<th>周数</th>
<th>课程类型</th>
<th>学分</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${selectedCourseList}" var="item">
<%--输出还没修完的课程--%>
<c:if test="${!item.over}">
<tr>
<td>${item.couseCustom.courseid}</td>
<td>${item.couseCustom.coursename}</td>
<td>${item.couseCustom.teacherid}</td>
<td>${item.couseCustom.coursetime}</td>
<td>${item.couseCustom.classroom}</td>
<td>${item.couseCustom.courseweek}</td>
<td>${item.couseCustom.coursetype}</td>
<td>${item.couseCustom.score}</td>
<td>
<button class="btn btn-default btn-xs btn-info" onClick="location.href='/student/outCourse?id=${item.courseid}'">退课</button>
</td>
</tr>
</c:if>
</c:forEach>
</tbody>
</table>
3)已修课程模块
该模块的功能是可以显示已修完的课程,当该课程已经结课时,并且结课考试已经考试完毕后,老师那边会出现同学的打分信息,待老师将成绩录入该系统后,也就是老师已进行评阅并给出成绩,学生可以通过这个模块查看已修课程的考试成绩,以及其他个人信息。如图19所示:
关键代码:
<div class="panel-heading">
<div class="row">
<h1 class="col-md-5">已修课程</h1>
</div>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>课程号</th>
<th>课程名称</th>
<th>授课老师编号</th>
<th>上课时间</th>
<th>上课地点</th>
<th>周数</th>
<th>课程类型</th>
<th>学分</th>
<th>成绩</th>
</tr>
</thead>
<tbody>
<c:forEach items="${selectedCourseList}" var="item">
<%--输出已修完的课程--%>
<c:if test="${item.over}">
<tr>
<td>${item.couseCustom.courseid}</td>
<td>${item.couseCustom.coursename}</td>
<td>${item.couseCustom.teacherid}</td>
<td>${item.couseCustom.coursetime}</td>
<td>${item.couseCustom.classroom}</td>
<td>${item.couseCustom.courseweek}</td>
<td>${item.couseCustom.coursetype}</td>
<td>${item.couseCustom.score}</td>
<td style="color: red">${item.mark}</td>
</tr>
</c:if>
</c:forEach>
</tbody>
</table>
五、项目总结
本次课程设计主要完成的工作包括:
- 参考了一些国内期刊、硕士论文、书籍等文献,来为自己提供思路,系统地了解了开发信息管理系统需要的工作流程、方法以及思路;
- 对项目进行可行性研究、需求分析,详细地设计了后台数据库,并完成了7个数据表的制作,为进行应用系统开发做好了数据准备;
- 寻找合适的开发工具,最终选择了IDEA。学习在 IDEA 作为开发工具,访问和操作数据库需要掌握的知识,学习了网页制作的基本技术;
- 通过对系统的总体设计,构建好大致框架,为详细设计打下了坚实的基础;
- 细分整个系统为四个主要的子系统,分别是:登录模块、管理员模块、教师模块、学生模块。通过对系统中每个大模块进行细分,细化功能,使得“骨架”中填充了“血与肉”;
- 进行编码,之后测试系统能否正常使用,各个功能是否完备;
经测试,系统的性能表现良好,但仍存在一些不足,比如说:总体功能较少,有待继续填充;界面以表格、选项框为主,需要对界面进行美化等。