本科毕业设计管理系统的设计与实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dxx_111/article/details/81182770

 

 
   

本科毕业设计(论文)

 

题 目     本科毕业设计管理系统的设计与实现    

                                              

 

 

 

 

 

学院名称        计算机学院        

专业名称     信息管理与信息系统   

年级班级          1402         

学生姓名          杜新新          

指导教师          吴  岩          

 

 

 

2018 年 6 月

 

 

摘要

毕业设计是本科教育的一个重要环节,是锻炼和检验学生专业综合能力的重要途径。毕业设计教学管理中,涉及导师选择、题目拟定、题目审核、开题报告、中期检查、导师指导、毕业答辩等多个环节,因此它是一项系统而复杂的工作。采用传统的毕业设计管理模式,指导教师分配、毕业设计题目审核等工作涉及学生多、信息量大,如不采取信息化的手段进行处理将影响毕业设计管理工作的效率。因此设计毕业设计管理系统具有重要的现实意义。

本毕业设计基于河南理工大学计算机学院毕业设计管理工作的现状,设计并实现了本科毕业设计管理系统。系统以IntelliJ IDEA 2018作为开发工具,采用主流的面向对象的编程语言Java作为后台开发语言,以SSM作为系统开发框架,MySQL8.0作为数据库服务器,Layui框架实现前台网页的显示,设计并实现B/S模式的本科毕业设计管理系统。该系统的开发,使毕业设计的流程更加规范,进一步提高了教师的工作效率,为提升人才培养质量起到积极的推动作用。

 

关键词:毕业设计;管理系统;JAVA;SSM;Layui

 

 

ABSTRACT

Graduation design is an important part of undergraduate education, which is an important means of exercising and testing the overall professional skills of students.Management of graduation design teaching involves many links such as tutor selection, problem formulation, subject review, open report, mid-term review, tutor guidance, graduation reply, etc. It is therefore a systematic and complicated task.Using the traditional graduation design management model, the tasks of guiding teachers' assignments, graduation project titles, etc. involve a large number of students and a large number. If information processing is not adopted, the efficiency of graduation design management will be affected.Therefore, designing a graduation design management system has important practical significance.

The graduation design is based on the status quo of graduate design management work in the Computer College of Henan Polytechnic University. It has designed and implemented an undergraduate graduation design management system.The system uses IntelliJ IDEA 2018 as a development tool, using the mainstream object-oriented programming language Java as the backstage programming language, using SSM as the development framework, MySQL8.0 as the database server. The Layui framework realizes the display of web pages.I designs and implements a B/S structure graduate design management system.The development of this system has made the graduation design process more standardized, further improved the work efficiency of teachers, and played a positive role in promoting the quality of personnel training.

 

Key words:Graduation design;Management system;JAVA;SSM;Layui

 

 

 

 

 

目录

1.前言 1

1.1研究背景及意义 1

1.1.1研究背景 1

1.1.2研究目的及意义 1

1.2研究现状分析 2

1.3研究内容安排 2

2.项目主要技术分析 5

2.1系统体系结构 5

2.2系统开发技术 6

2.2.1HTML介绍 6

2.2.2CSS介绍 6

2.2.3JavaScript介绍 6

2.2.4JSP介绍 6

2.2.5Java技术介绍 7

2.3框架介绍 7

2.2.1layui框架简介 7

2.2.2Spring框架的简介 7

2.2.3SpringMVC框架的简介 7

2.2.4MyBatis框架的简介 8

3.系统分析 9

3.1可行性分析 9

3.1.1经济可行性 9

3.1.2技术可行性 9

3.1.3操作可行性 9

3.1.4管理可行性 9

3.2业务需求描述 10

3.3系统功能需求分析 12

3.3.1用户登录 13

3.3.2公告管理 14

3.3.3文件管理 15

3.3.4课题管理 15

3.3.5选题管理 16

3.3.6进度管理 17

3.3.7答辩管理 18

3.3.8查询统计 19

3.2.9系统管理 20

3.4系统性能需求分析 20

4.系统设计 21

4.1系统总体设计 21

4.1.1系统总体设计思路 21

4.1.2系统总体结构设计 21

4.2数据库设计 22

4.2.1数据库概念结构设计 22

4.2.2数据库逻辑结构设计 27

5.系统实现 33

5.1项目包结构搭建 33

5.2系统框架的实现 33

5.5.1Mybatis框架实现 33

5.5.2Spring框架实现 34

5.5.3SpringMVC框架实现 36

5.5.4web.xml文件的配置 36

5.3代码设计模块 37

5.3.1实体 37

5.3.2数据访问层(dao) 40

5.3.3业务逻辑层(service) 41

5.3.4控制层(controller) 41

5.4系统通用模块 41

5.5用户登录模块 44

5.6教师模块实现 46

5.6.1申报课题管理模块 46

5.6.2审批课题管理模块 50

5.6.3我的学生模块 53

5.6.4评阅管理模块 58

5.6.5答辩成绩管理模块 59

5.6.6成绩分析模块 59

5.7学生模块实现 62

5.7.1选择课题模块 62

5.7.2我的任务模块 62

5.7.3我的成绩模块 66

5.8管理员模块实现 66

5.8.1教师管理模块 66

5.8.2学生管理模块 66

5.8.3志愿管理模块 67

5.8.4课题管理模块 67

5.8.5公告管理模块 67

5.8.6文件管理模块 68

6.系统测试 69

6.1系统的调试 69

6.2系统的测试 69

6.2.1测试的重要性及目的 69

6.2.2测试方法 69

6.3登录功能模块测试 69

6.4课题管理功能模块测试 76

6.4选题管理功能模块测试 76

7.结论 77

致谢 79

参考文献 81

 

 

 

 

1.前言

1.1研究背景及意义

1.1.1研究背景

我国信息技术和网络技术发展迅速,各行各业都在进行信息化管理,教育行业也不例外。数字化校园网为高校教务管理信息化提供了必备的物质基础[1]。随着教育改革的深入发展以及办学规模的不断扩大,各高校教务工作量倍增。面对大量而繁琐的教务管理工作,传统的手工管理方式已经成为学校高效运转的瓶颈。因此,利用信息技术和网络技术实现管理信息化,对教务工作进行高效的管理,成为各大高校的建设目标。

毕业设计是本科教育的一个重要环节,是锻炼大学生综合能力的一个过程,同时也能够全面检测大学生专业知识的掌握与运用情况。毕业设计教学管理中,涉及导师选择、题目拟定、题目审核、开题报告、中期检查、导师指导、毕业答辩等多个环节,涉及专业教师、全体毕业生、专业负责人等大量人员,因此毕业设计教学管理工作是一项系统而复杂的工作。

在传统的毕业设计管理模式中,存在不少管理上的不规范、工作繁琐、效率低下等突出问题,例如:毕业设计的选题、过程管理的监控、文档资料的留存、毕设成绩的统计分析等工作还没有有效地、规范地管理起来,导致学校的教学管理滞后于现代网络化的管理要求。针对目前毕业设计管理工作中存在的问题,本毕业设计对毕业设计管理流程进行调查与研究,设计并开发适合本学院的本科毕业设计管理系统,实现了本学院毕业设计管理的高效化、网络化与规范化。

1.1.2研究目的及意义

毕业设计管理系统的开发,不但能够提高工作效率、减轻日常管理人员的负担,也为学生和教师的工作提供更大的方便。如今计算机学院的毕业设计管理系统功能模块不够完善,界面设计不够友好,操作不够方便。针对目前河南理工大学毕业设计管理工作相关制度以及计算机学院学生毕业设计管理工作的特点,本毕业设计对计算机学院毕业设计管理系统进行分析与设计。本系统从课题申报、课题审核、学生选题、相关材料的提交、论文评阅、毕业答辩等环节进行管理,实现了毕业设计的整个流程的管理。毕业设计管理系统的开发,不但方便同学和教师之间的沟通交流,方便指导教师对学生进行指导,同时能够使毕业设计的流程更加规范,也进一步提高了教师的工作效率,为提升人才培养质量起到积极的推动作用,因此,开发毕业设计管理系统具有较强的现实意义。

1.2研究现状分析

目前社会上有很多已经实现的毕业设计管理系统,例如:华南理工大学本科毕业设计(论文)管理系统,它们的系统功能齐全,覆盖了整个毕设的工作流程,但是选题模块不能满足学生和导师双选的效果;上海交通大学毕业设计管理系统,没有教师申报指定学生课题的功能,未能实现在线文档编辑功能;东华理工大学毕业设计双向选题系统,主要实现了学生导师双向选题的功能模块。从国内的研究现状来看,目前国内大部分高校对本科毕业设计的管理工作仍然采用传统的手工模式,部分高校根据学校现状和特点,自行开发了适合本校的毕业设计管理系统。

国外的本科毕业设计管理系统的研究方向偏向于双向选题管理和过程监控管理等[3]。双向选题使得学生能够找到自己感兴趣的研究方向,导师也可以择优选择自己的学生,并且能够实现远程办公的功能,使得导师就像面对面指导,实现师生的互动和在线交流;过程监控有效地控制着毕业设计管理工作的整个流程,同时也能监督学生毕设进展,使得学生在指导教师的监控下按阶段完成毕业设计。例如,日本的东京大学计算机科学与技术学院设计开发的毕业设计题目申报与管理系统,主要实现教师课题申报、课题审核、学生选题以及过程监控等功能[3]。

虽然国外的本科毕业设计管理系统相当成熟,由于我国的教学管理理念、教育机制以及管理制度与国外不同,引进国外的毕业设计管理系统并不能满足我们的需求[3]。本毕业设计通过结合河南理工大学毕业设计管理规定,并借鉴其他高校包括国外高校本科毕业设计管理系统,个性化地为本学院设计一个本科毕业设计管理系统。通过引进该系统,不但使毕业设计的管理流程更加规范,同时能够提高教学管理人员以及专业教师的工作效率,提高毕业设计的整体质量。

1.3研究内容安排

本论文主要对河南理工大学计算机学院本科毕业设计管理系统的设计与实现过程进行说明。本文共分八章,论文的组织结构如下:

第一章 前言:本章节阐述课题开发背景、目的及意义、当前国内外本科毕业设计管理系统的研究现状和论文主要的研究内容。

第二章 项目主要技术分析:主要描述了本系统使用到的主要技术,包括系统的体系结构和编程框架(Layui、Spring、SpringMVC和Mybatis)。

  • 系统分析:通过用户调研和查阅相关资料,从系统的可行性、业务需求、功能需求和性能需求等方面进行详细分析,在功能需求分析中,通过使用用例图和活动图对系统的功能需求进行分析,从而确定出系统的每个功能的操作者,以及多对象跨多用例的活动顺序。
  • 系统设计:在系统分析的基础上,对该系统的总体结构进行设计,最终画出系统流程图,通过E-R图对数据库概念结构进行设计,然后以图表的形式展示每个表、视图以及表间联系的详细信息。

第五章 系统实现:本章对系统各功能模块的实现进行详细描述,展示系统主要操作界面及部分关键代码。

第六章 系统测试:本章主要描述了系统测试的目的、常用的测试方法,并以登录功能为例,设计合理的测试用例进行实际测试。

第七章 总结:本章对本系统的开发进行总结。说明本系统实现的功能模块及系统的设计过程,分析毕业设计中遇到的问题和相应的解决的方法,最后简单介绍本人毕业设计的心得体会。

第八章 致谢:本章节主要对毕业设计指导教师和给予帮助的同学表达由衷的感谢

 

 

 

2.项目主要技术分析

2.1系统体系结构

软件体系架构设计是在软件系统设计中最为重要的一环,决定系统是否具有可重用性和可扩展性,对后期的维护和扩展具有重要意义,目前主流的软件体系架构有C/S模式、B/S模式和C/S+B/S混合模式等[2]。

C/S结构指的是客户端/服务器模式的软件体系结构。在该模式中,客户端需要具有一定的数据存储和处理的能力,在接收到用户请求之后,通过一定的协议与服务器进行通信[5],将服务器返回的内容经过处理后以相应的形式展示给用户。

B/S结构指的是浏览器/服务器模式的软件体系结构。在该模式中,客户端只要装上操作系统(自带浏览器),通过使用浏览器,即可成功访问服务器端发布的项目。客户端仅负责接收用户请求并将服务器返回的结果向用户展示,软件应用的事物逻辑完全在服务器端实现。该模式相对于C/S模式,软件构件的独立性高,有较好的重用性,有利于后期对系统进行维护和升级,由于B/S模式采用三层分布式结构,使系统负载均衡分布,用户量的增加对其性能影响较小。

 

 
   

所以本毕业设计管理系统采用B/S模式体系架构进行开发。B/S模式体系结构如图2-1所示。

图2-1 B/S模式体系结构图

2.2系统开发技术 

2.2.1HTML介绍

超文本标记语言(HTML),通过在文本文件中加入标签,使标签中的内容以规定的格式进行显示。该文件以.html为扩展名,以<html>开头,以</html>结尾,其中包含了<head>标签和<body>标签。<head>中包含的标记是页面的标题(title)、引入的类库、页面元信息等内容,<body>中的内容通过浏览器解释后以网页的形式向用户展示。

2.2.2CSS介绍

CSS(Cascading Style Sheets)是层叠样式表的英文缩写,它提供了丰富的样式定义,可以对HTML文件中的标签样式进行修饰,使页面展示更加美观,还可以配合各种脚本语言动态地对网页中的元素进行修饰。引入CSS样式可以将网页文字内容和样式分开存储,从而使代码逻辑更加清晰,易于使用和修改。

2.2.3JavaScript介绍

JavaScript简称JS,它是客户端的脚本语言,代码不需要进行编译,由浏览器解释执行。它还是一种采用事件驱动的脚本语言,在用户在网页上执行一些操作之后,它可以不通过web服务器直接对这些事件作出响应,通常使用JS做一些简单的逻辑判断。JavaScript通过和HTML以及CSS技术结合,能够设计出美观友好的用户界面,增强用户的体验。

2.2.4JSP介绍

JSP是Java服务器页面的英文缩写,是以Java语言作为脚本语言建立在Servlet规范提供的功能之上的动态网页技术,用来在网页上显示动态内容,由Java程序片段和JSP标记构成,其根本是一个简化的Servlet设计,能够将请求处理和业务逻辑代码与表示相分离,JSP文件在第一次运行的时候会先解析成servlet源文件,然后编译成servlet类文件,最后才会被servlet容器运行,执行过程如图2-2所示。

 

 
   

图2-2 JSP执行过程

2.2.5Java技术介绍

Java是目前主流的面向对象编程语言,有许多有用的类库,Java8通过引入流的API,使得它支持许多处理数据的并行操作,并且编写的代码更简洁。Java的“一次编译,到处运行”的模式,使得它具有卓越的平台移植性。由于Java具有通用性、高效性、平台移植性和安全性等优良特性,使得Java应用具有无比的健壮性和可靠性。

2.3框架介绍

2.2.1layui框架简介

Layui是一款采用自身模块规范编写的响应式前端 UI 框架,遵循前端开发规范,简单易学,非常适合界面的快速开发。Layui 不同于那些基于 MVVM 底层的 UI 框架,它主要是面向服务端开发人员,避开各种前端工具的复杂配置,重新回归到原生态的 HTML/CSS/JavaScript本身。

2.2.2Spring框架的简介

Spring是一个开放源代码的轻量级Java开发框架,是为了解决企业应用开发的复杂性而创建[4]。Spring可以让简单的JavaBean实现之前只有EJB(Enterprise JavaBean)才能完成的事情,是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架,但Spring不仅仅限于服务器端的开发,任何Java应用都能在简单性、可测试性和松耦合性等方面从Spring中获益,Spring最根本的使命是简化Java开发[4]。

2.2.3SpringMVC框架的简介

Spring MVC是当前非常流行的JAVA框架,提供了MVC(模型-视图-控制器)架构,使用方法映射路径的方式,相比传统的Servlet和Struts2更加灵活简便。同时MVC模式导致应用程序的输入逻辑、业务逻辑和UI逻辑相分离,同时提供这些元素之间的松耦合[10]:

(1)模型(Model)封装了应用程序数据,通常由POJO类组成;

(2)视图(View)负责渲染模型数据,生成客户端浏览器可以解释的HTML文件;

(3)控制层(Controller)负责处理用户请求并构建适当的模型,将其传递给视图进行渲染。

2.2.4MyBatis框架的简介

Mybatis框架是一个基于Java的持久层框架,包括SQL Maps和DAO(Data Access Objects),它支持程序员自己编写SQL,同时也能支持存储过程,所以它能够处理一些复杂的和需要优化性能SQL查询,它几乎能做到JDBC所能做到的所有事情,在注意一些规则的基础上,MyBatis可以给我们完成自动映射,这大大提高了开发效率和灵活性[8]。

2.2.5SSM框架的执行流程

SSM框架是由Spring、Spring MVC、Mybatis三层框架组合而成。首先浏览器发起HTTP请求,DispatchServlet捕获并根据请求路径将任务委托给具体的控制器。控制器接收参数并转换为合适的对像传递到Service层,Service层处理具体的业务逻辑,利用Dao层将数据持久化,然后将处理结果返回至Controller,

Controller将结果转换为相应的模型,渲染jsp页面,输出到浏览器,供用户浏览。

SSM程序执行流程图如图2-3所示。

 

 
   

图2-3 SSM程序执行流程图

 

3.系统分析

3.1可行性分析

按照软件工程的思想,在进行软件需求分析前,需要从经济、技术、操作和管理等方面进行可行性分析,从而判断软件是否值得开发,以避免人、才、物的浪费。

3.1.1经济可行性

经济可行性需要确定出开发本科毕业设计管理系统的总成本和总收益,然后对总成本和总收益进行比较,当总收益大于总成本时,这个项目才值得开发[5]。

毕业设计管理系统作为一个中小型的管理系统,软件开发和维护由本校学生完成,因此不需要投入过多的开发和维护费用,部署所需要的服务器配置也不需要太高,硬件所需费用低,高校完全能够负担起这笔开支。在该系统实施后,不仅可以减轻教学管理人员的工作负担,提高工作效率,而且可以方便指导教师对学生毕设的监控和指导,有利于提高该校学生的毕设质量,其产生的总收益远远超过总成本,因此在经济上是可行的。

3.1.2技术可行性

随着互联网迅速发展,高校几乎全都实现了校园网络全覆盖,这对该系统的实施提供了网络支持。近年来,随着科技发展的不断加快,硬件性价比也随之提高,电脑在大学生中已经得到普及,这对该系统的实施提供了硬件的支持。在软件方面,本系统以IntelliJ IDEA2018作为开发工具,采用Java8作为后台开发语言,以SSM作为开发框架,tomcat 8.5作为Web服务器,MySQL 8.0作为数据库,用Navicat可视化界面对数据库进行设计,Layui框架实现网页的显示。系统开发涉及到的技术和工具都十分成熟,已经大量应用于企业级信息化系统中,因此技术上是可行的。

3.1.3操作可行性

本系统采用B/S架构进行设计,用户通过客户机上的IE、火狐等web浏览器即可成功访问该网站,并对其进行操作。系统界面友好,用户仅需简单试用皆能熟练掌握该系统的操作流程,因此本系统具有较好的可操作性。

3.1.4管理可行性

该系统包括申请课题、课题审核、双向选题、开题报告、中期检查、论文评阅、毕业答辩、成绩管理等模块,通过该系统,方便教师对学生的进度进行监控,也方便教学管理人员对毕设进度进行监控管理,对成绩进行统计分析,因此在管理方面具有可行性。

通过以上四个方面的可行性分析,可以得出该系统的开发具有可行性。

3.2业务需求描述

目前计算机学院毕业设计系统功能模块不够完善,系统界面不够友好,模块划分不够清晰,大部分工作仍然采用人工管理方式,为教学管理人员带来了极大的压力,也不利于指导教师对学生的毕业设计的监控和指导。通过对系统需求进行调研,本系统应该满足如下的业务需求:

(1)教师申报课题策略:教师可以申报盲选课题和申报指定学生课题两种形式,在教师申报盲选课题后,由专业负责人根据各专业的培养目标,审核课题是否通过,审核通过的课题,即可在系统中发布,供毕业生选择;对于一些特殊情况,有些学生在本科期间,跟随教师做科研或项目,教师可以在申报毕业设计课题的同时指定学生,使学生能够选择自己感兴趣的课题作为毕设课题。

(2)学生选择课题策略:学生选择课题共分两个阶段,首先学生进行初次选题,初选中每位学生允许选择一个课题,但是每一个课题允许多名学生进行选择,指导教师对选择课题的学生进行筛选,有效地保证了学生与导师之间的双向选择,初选未被选中的学生进入二次选题,二次选题后如有学生仍未选择课题将由专业负责人进行课题分配[11]。

(3)教师指导学生策略:确定选题后,学生在线进行开题报告、中期检查报告的撰写,并将写好的文档上传至系统,毕设论文通过文件提交系统,供指导教师审核,指导教师发现问题后,可以在留言区给学生留言,将问题告知学生,进行修改,直到指导教师满意为止,指导教师根据平时表现,录入平时成绩和评语。

(4)评阅和答辩策略:评阅教师的分配由系统自动完成,评阅教师可以查看为本人待评阅的学生及其论文,并为其录入评阅成绩和评语;专业负责人可以管理(修改和查询)该专业所有学生的评阅成绩和评语。答辩安排由专业负责人完成后交由系统管理员,系统管理员通过公告的方式通知学生和教师进行答辩。答辩完成后,由专业负责人录入答辩成绩和评语,系统自动进行成绩分析,供专业负责人参考。

该系统的业务分析流程图如图3-1所示。

 

 

 

 

 

 

 
   

图3-1 业务分析流程图

3.3系统功能需求分析

本系统共涉及系统管理员、全体毕业生、指导教师、评阅教师和专业负责人五种角色。通过这五种角色操作的相互配合,共同完成了从课题申报、审批课题、双向选题、开题报告、中期检查、毕业论文、成绩管理等功能。

(1)指导教师模块:该模块主要负责申报课题(包括申报指定学生的课题和未指定学生的课题)、学生选题结束后选择已选课题的学生、查看指导学生、查看学生提交的成果文档并给出指导建议、评审学生提交的成果文档、录入学生的平时成绩和评语等等

(2)评阅教师模块:该模块主要负责查看评阅学生的论文,填写评阅意见并给出评阅成绩等。

(3)专业负责人模块:该模块主要负责对指导教师的课题进行审批、为未选课题学生指定课题、分配评阅教师、录入答辩成绩及评语、对学生的成绩进行统计分析等。

(4)学生模块:该模块主要负责选择毕业设计题目、提交毕设各阶段成果文档(开题报告、中期检查、毕业论文)、查询毕设成绩等。

(5)系统管理员模块:教师信息管理、学生信息管理、公告信息管理、文件信息管理(包括毕业设计相关表格和优秀毕业论文)、志愿管理、课题信息管理等。

(6)公共模块:公共模块是五大角色都可以访问到的模块,在该模块中,用户可以查看毕业设计进度、查看最新公告、下载毕业设计相关表格、下载优秀论文、查看系统消息等等。

根据本科毕业设计管理系统涉及的各角色的业务需求,画出本科毕业设计管理系统的功能模块图,如图3-2所示。

 

 
   

图3-2 本科毕业设计管理系统的功能模块图

3.3.1用户登录

系统中的用户角色包括指导教师、评阅教师、专业负责人、学生以及系统管理员,用户在登录系统前需要选择用户角色,登录后系统会根据用户角色跳转到相应的系统模块,为了保证个人账户的安全性,用户登录后可以进入修改密码页面对密码进行修改。用户登录的用例图如图3-3所示。

 

 
   

图3-3 用户登录用例图

3.3.2公告管理

 

 
   

在公告管理模块中,系统管理员具有发布公告的权限,系统管理员、教师(指导教师、评阅教师、专业负责人、答辩组组长)和学生可以查看系统公告,公告管理的用例图如图3-4所示。

图3-4 公告管理用例图

3.3.3文件管理

 

 
   

在文件管理模块中,系统管理员可以上传毕业设计相关的文件资料、往届优秀毕业论文,所有角色均可下载需要的文档进行查看,当文件需要更新时,系统管理员可以对文件进行删除,文件管理用例图如图3-5所示。

图3-5 文件管理用例图

3.3.4课题管理

 

 
   

在课题管理模块中,指导教师根据自己的科研教学经验,拟定适合该专业学生的毕业设计课题,将拟定好的课题提交后,专业负责人审核该专业教师申请的课题,判断指导教师申请的课题任务量、难易程度等方面是否符合要求,将不符合要求的课题退回,指导教师对这些课题进行修改后,再次上传供专业负责人审核,如果课题符合培养方案的要求,审核通过后供学生选择,课题管理的用例图如图3-6所示。

图3-6 课题管理用例图

 

 
   

课题管理的活动图如图3-7所示。

图3-7 课题管理活动图

3.3.5选题管理

在选题管理模块中,列出了当前学生可以选择的课题,学生可以查看课题的名称、类型、指导教师以及该课题的详细信息,选择感兴趣的课题作为毕设课题,学生选题结束后,指导教师能够查看本人申请成功的课题被选情况,并根据学生的综合能力,从多个已经选择该课题的学生中选择最佳的学生,其余学生进入二次选题阶段,在该阶段学生按照同样的方式在剩余课题中选择课题,教师对已选课题进行确认,通过两次双选之后,仍未选择课题的学生,由专业负责人随机指

 

 
   

定。选题管理的用例图如图3-8所示。

图3-8 选题管理用例图

 

 
   

选题管理活动图如图3-9所示。

图3-9 选题管理活动图

3.3.6进度管理

 

 
   

在进度管理模块中,学生针对自己的毕业设计课题,按照毕业设计各个阶段的要求,按系统提示的时间阶段填写开题报告、中期检查、论文初稿等文档,供指导教师审阅,指导教师根据文档书写情况,给出修改意见并反馈给学生,学生收到反馈建议后,对文档进行修改,重新提交供指导教师审阅,直到指导教师满意为止,最终版的文档作为毕业设计留存文档。进度管理用例图如图3-10所示。

图3-10 进度管理用例图

 

 
   

进度管理的活动图如图3-11所示。

图3-11 进度管理的活动图

3.3.7答辩管理

 

 
   

在答辩管理模块中,系统管理员将答辩安排以公告的形式发布在系统中,教师和学生登录系统后,可以查看答辩安排的详细信息(包括答辩组组长、答辩组教师列表、答辩时间、答辩地点、答辩学生列表等),答辩结束后,答辩组组长将该组学生的答辩成绩和评语录入系统,系统按照一定的规则计算出每位学生的总成绩,答辩管理的用例图如图3-12所示。

图3-12 答辩管理的用例图

答辩管理活动图如图3-13所示。

 

 
   

图3-13 答辩管理活动图

3.3.8查询统计

 

 
   

在毕设过程中,指导教师能够查看申请的课题是否通过审核,审核通过的课题的被选学生列表,学生能够查看本人选择的课题是否被指导教师确认,系统管理员能够查看指导教师课题申请的详细信息以及学生选题的详细信息。在毕业设计期间,学生能够查看毕设进度,来按时完成各阶段任务,指导教师能够查看本小组每位同学的毕设情况,从而能够实时监控并督促进度滞后的学生尽快调整进度。毕设结束后,学生能够查看本人的成绩,专业负责人能够查看本专业学生的成绩,同时能够生成统计报表,对毕设成绩进行统计分析,查询统计用例图如图3-14所示。

图3-14 查询统计用例图

3.2.9系统管理

系统管理模块是专为系统管理员服务,系统管理员可以在该模块中对学生信息、教师信息、公告信息、文件信息、课题信息以及志愿信息进行维护,还可以为教师分配角色,一个教师可以承担不同的角色,不同的角色拥有不同的权限,从而确保数据操作的安全性,系统管理用例图如图3-15所示。

 

 
   

图3-15 系统管理用例

3.4系统性能需求分析

除了系统的功能性需求,系统的稳定性、易用性、安全性、可扩展性等性能需求也是系统需求分析的重要组成部分,在该系统的设计与实现过程中,需要满足以下需求:

(1)稳定性:本系统要求能稳定运行,多用户同时访问时,不易产生系统崩溃或响应时间变慢等情况[9]。

(2)易用性:在该系统开发过程中,应该采用友好美观的用户界面,功能模块分类清晰,符合用户操作习惯,增强与用户交互性设计,通过简单的使用,就能够熟练进行相关的业务操作。

(3)安全性:系统应该充分考虑数据和应用的安全性,防止用户误操作给系统的运行和内部的数据造成破坏[2]。用户登录需要分角色,不同的角色拥有不同的权限,从而保证数据库的安全性,各种输入的信息,必须进行合法性检验,所有删除操作,均需提供警示信息,需要操作者二次确认才能删除。

(4)可扩展性:系统采用模块化设计,在系统上线后依然能够根据用户的需求,对各大功能模块进行扩充,从而适应用户需求的变化。

 

4.系统设计

4.1系统总体设计

4.1.1系统总体设计思路

本科毕业设计管理系统的主要设计思路:首先进行数据库表的结构设计,向数据库中插入测试数据,在IntelliJ IDEA 2018开发工具中搭建SSM框架,然后对前台页面进行设计与实现。具体执行流程为:前台与Controller层交互,将service注入Controller层,Dao注入Service层,最终Dao映射到对应的Mapper.xml文件,通过SQL操作数据库,最终将结果返回给前台,向用户展示。

4.1.2系统总体结构设计

在需求分析的基础上,经过总体设计,将该系统划分为四大模块,并确立了模块间的调用管理和数据传递关系。

通过浏览器访问该网站,首先会跳转到游客页面,在该网页中包含了最新公告、相关表格、优秀毕业论文等内容,教师、学生、管理员可以通过该页面选择不同的角色进行登录,如果是合法用户,可以跳转到网站首页(网站首页是三大用户共有功能),用户可以查看毕业设计进度、最新公告、下载毕设相关文件、往届优秀论文和待办事项。

(1)以管理员身份登录,其功能有:教师信息管理(教师信息的增、删、改操作和权限分配)、学生信息管理(学生信息的增、删、改操作)、公告管理(上传公告、删除公告)、文件管理(模板和优秀毕业论文的上传和删除)、课题管理、选题管理。

(2)以教师身份登录:如果该教师是指导教师,其功能有:申报课题(可以申报指定学生的课题和未指定学生的课题)、我的学生管理(包括选择学生、指导学生、评审学生文档、录入平时成绩和评语)、我的课题管理;如果该教师是评阅教师,其功能有:查看学生论文、提交评阅成绩和评语;如果该教师是专业负责人,其功能有:审批教师课题、答辩成绩录入、对本专业毕业生的成绩进行分析。

(3)以学生身份登录,其功能有:选择课题、我的任务(包括在线提交开题报告、中期检查,以文件的形式提交论文,还可以在留言区与教师交流)、我的成绩(学生可以在该模块查看本人的平时成绩、评阅成绩和答辩成绩)。

本系统的系统流程图如图4-1所示。

 

 

 
   

图4-1 系统流程图

4.2数据库设计

数据库设计的优劣将直接影响信息系统的质量和运行效果,如果数据库模型设计的不合理,即使使用性能良好的DBMS软件,也很难使应用系统达到良好的状态[6]。因此,严格按照数据库设计的流程,通过用户需求分析,得到一个独立于DBMS的概念模型[5],将概念模型转换为MySQL所支持的数据模型,通过范式理论优化关系模式,从而在满足系统效率的前提下,设计出一个范式尽可能高的数据库。

4.2.1数据库概念结构设计

通过对系统进行需求分析和数据抽象,从中抽取出系统中与数据相关的各个实体以及实体间的联系,形成数据库概念模型,并用图示方法表示出来,即E-R图(实体-联系图)。毕业设计管理系统中涉及到的实体有:教师实体(含管理员)、学生实体、文件实体、公告实体、课题实体、选题实体、开题报告实体、中期检查实体、论文实体、评阅实体、建议实体,各个实体的具体E-R图描述如下:

教师实体的E-R图描述如图4-2所示。

 

 

 

 

 
   

图4-2 教师实体E-R图

 

 
   

学生实体的E-R图描述如图4-3所示。

图4-3 学生实体E-R图

 

 
   

文件实体的E-R图描述如图4-4所示。

图4-4 文件实体E-R图

公告实体的E-R图描述如图4-5所示。

 

 

 
   

图4-5 公告实体E-R图

 

 
   

课题实体的E-R图描述如图4-6所示。

图4-6 课题实体E-R图

选题实体的E-R图描述如图4-7所示。

 

 
   

图4-7 选题实体E-R图

 

 
   

开题报告实体的E-R图描述如图4-8所示。

 

 
   

图4-8 开题报告实体的E-R图

中期检查实体的E-R图描述如图4-9所示。

图4-9 中期检查实体E-R图

论文实体的E-R图描述如图4-10所示。

 

 
   

图4-10 论文实体E-R图

评阅实体的E-R图描述如图4-11所示。

 

 
   
 
   

图4-11 评阅实体E-R图

建议实体的E-R图描述如图4-12所示。

图4-12 建议实体的E-R图

该系统的总体E-R图如图4-13所示。

 

 
   

图4-13 系统总体E-R图

 

4.2.2数据库逻辑结构设计

 

 
   

在数据库需求分析和概念结构设计的基础上,将概念模型转化为相应的逻辑数据表,即对数据库表的结构进行设计。本系统中用到的表有:教师信息表teacher,学生信息表student,文件信息表file,公告(留言)信息表notice,课题信息表title,选题信息表s_t,开题报告信息表open_report,中期检查信息表mid_check,论文信息表thesis,评阅信息表review,建议表comments等。用到的视图有:学生成绩视图grade。如图4-14所示。

图4-14 本系统数据库中的表

系统中用到的主要表结构描述如下:

(1)教师信息表teacher

教师信息表用来存储教师编号、姓名、密码、性别、学院、专业、职称、研究领域、电话号码、邮箱信息,如表4-1所示。

表4-1 教师信息表

字段名称

数据类型

数据长度

是否主键

允许空值

注释

Tid

varchar

64

教师号

Tname

varchar

8

姓名

Tpwd

varchar

64

密码

sex

enum

0

性别

college

varchar

16

学院

major

varchar

16

专业

rank

varchar

16

职衔

research_area

varchar

16

研究领域

telephone

varchar

16

电话号码

Email

varchar

32

邮箱

(2)学生信息表student

学生信息表用来存储学生学号、姓名、密码、性别、年龄、学院、专业、班级、电话、Email信息,如表4-2所示。

表4-2 学生信息表

字段名称

数据类型

数据长度

是否主键

允许空值

注释

Sno

varchar

64

学号

Sname

varchar

8

姓名

Spwd

varchar

64

密码

sex

enum

0

性别

age

int

64

年龄

college

varchar

16

学院

major

varchar

16

专业

Sclass

varchar

16

班级

telephone

varchar

16

电话号码

Email

varchar

32

邮箱

(3)文件信息表file

文件信息表用来存储文件编号、文件名、文件存储路径、文件大小、上传时间、文件类型(模板文件、优秀毕业论文和最新公告的附件)信息,如表4-3所示。

表4-3 文件信息表

字段名称

数据类型

数据长度

是否主键

允许空值

注释

file_id

bigint

64

文件编号

file_name

varchar

64

文件名称

file_path

varchar

255

文件路径

file_size

int

64

文件大小

upload_datetime

datetime

0

上传时间

type

varchar

32

文件类型

(4)公告信息表notice

公告信息表用来存储公告编号、标题、内容、发布的时间、附件编号的信息,如表4-4所示。

 

 

 

 

表4-4 公告信息表

字段名称

数据类型

数据长度

是否主键

允许空值

注释

Nid

bigint

64

公告编号

N_title

varchar

64

公告标题

N_datetime

datetime

0

公告时间

N_content

varchar

1000

公告内容

N_appendix_id

bigint

64

附件编号

(5)课题信息表title

课题信息表用来存储课题编号、课题名称、申请该课题的教师编号、课题描述、课题类型、课题状态的信息,如表4-5所示。

表4-5 课题信息表

字段名称

数据类型

数据长度

是否主键

允许空值

注释

titleId

bigint

64

课题编号

title_name

varchar

64

课题名称

tid

varchar

64

教师编号

problem_desc

varchar

2000

课题描述

kind

varchar

10

课题类型

T_state

enum

0

课题状态

(6)选题信息表s_t

选题信息表用来存储选课学生的编号、课题编号、选中状态、平时成绩、平时表现评语、答辩成绩和答辩评语的信息,如表4-6所示。

表4-6 选题信息表

字段名称

数据类型

数据长度

是否主键

允许空值

注释

Sno

varchar

12

学生编号

titleId

bigint

64

课题编号

sel_state

enum

0

选中状态

usual_grade

double

0

平时成绩

usual_comments

varchar

500

平时表现评语

reply_grade

double

0

答辩成绩

reply_comments

varchar

500

答辩评语

(7)开题报告信息表open_report

开题报告信息表用来存储开题报告的编号、课题来源、课题预期成果、学生学号、选题依据、目的意义、主要参考文献、研究内容、进度安排、特色和创新点、是否可行、任务量大小、是否同意开题的信息,如表4-7所示。

表4-7 开题报告信息表

字段名称

数据类型

数据长度

是否主键

允许空值

注释

Rid

bigint

64

开题报告编号

Tsource

varchar

10

课题来源

expect_outcome

varchar

10

预期成果

Sid

varchar

64

学生学号

title_basic

longtext

0

选题依据

purpose_mean

longtext

0

目的意义

references

longtext

0

参考文献

research_contents

longtext

0

研究内容

schedul

longtext

0

进度安排

feature_Inno

longtext

0

特色创新

feasibility

enum

0

可行性

task_load

enum

0

任务量

agree_open

enum

0

是否同意开题

Esignature

varchar

64

教师签名

(8)中期检查信息表mid_check

中期检查表用来存储中期检查文档编号、学生学号、进度情况、阶段性成果、存在的主要问题及解决方法、教师评语、教师签名、提交日期时间的信息,如表4-8所示。

表4-8 开题报告信息表

字段名称

数据类型

数据长度

是否主键

允许空值

注释

Mid

bigint

64

中期检查编号

Sid

varchar

12

学生学号

progress_status

longtext

0

进度情况

staged_achieve

longtext

0

阶段成果

problem_solve

longtext

0

问题解决方案

remark

varchar

100

教师评语

signature

varchar

64

教师签名

datetime

datetime

0

日期时间

(9)论文信息表thesis

论文信息表用于存储学生上传论文的编号、学生学号、课题编号、上传的日期时间、附件编号的信息,如表4-9所示。

 

表4-9 论文信息表

字段名称

数据类型

数据长度

是否主键

允许空值

注释

thesis_Id

varchar

64

论文编号

author_Id

varchar

12

学生编号

Title_Id

bigint

64

课题编号

upload_time

datetime

0

日期时间

attachment_Id

bigint

64

附件编号

(10)评阅信息表review

评阅信息表用于存储学生编号、教师编号、评阅成绩和评阅评语的信息,如表4-10所示。

表4-10 论文信息表

字段名称

数据类型

数据长度

是否主键

允许空值

注释

Sno

varchar

12

学生编号

Tid

varchar

64

教师编号

review_grade

double

32

评阅成绩

review_comment

varchar

1000

评语

(11)建议表comments

建议表用于存储建议编号、内容、附件编号、发送者编号、提交日期时间、建议类型(开题报告、中期检查和论文)以及类型编号(用于存储统一类别的留言建议的编号),如表4-11所示。

表4-11 建议表

字段名称

数据类型

数据长度

是否主键

允许空值

注释

id

bigint

64

建议编号

content

varchar

255

建议内容

attachment_id

bigint

64

附件编号

sender_id

varchar

64

发送者编号

create_date

datetime

0

日期时间

type

enum

0

建议类型

typeId

varchar

64

类型编号

(12)学生成绩视图grade

学生成绩视图是为了方便专业负责人统计本专业成绩,同时也方便学生查询本人成绩,学生成绩视图如图4-15所示。

 

 
   

图4-15 学生成绩视图

  1. 系统的表间关系图

为了保证数据的一致性,在本数据库系统中,根据应用的需要,一共设定了12个外键,分别为:

①s_t表中的“Sno”列参照student表的“Sno”列。

②s_t表中的“tittleId”列参照tittle表的“tittleId”列。

③open_report表中的“Sid”列参照student表的“Sno”列。

④mid_check表中的“Sid”列参照student表的“Sno”列。

⑤thesis表中的“author_Id”列参照student表的“Sno”列。

⑥thesis表中的“tittleId”列参照tittle表的“tittleId”列。

⑦thesis表中的“attachment_Id”列参照file表的“file_id”列。

⑧comments表中的“attachment_id”列参照file表的“file_id”列。

⑨notice表中的“N_appendix_id”列参照file表的“file_id”列。

⑩tittle表中的“tid”列参照teacher表的“Tid”列。

⑪review表中的“Sno”列参照student表的“Sno”列。

⑫review表中的“Tid”列参照teacher表的“Tid”列。

 

 
   

该系统中表之间的关系图如图4-16所示。

图4-16 系统的表间关系图

 

5.系统实现

5.1项目包结构搭建

在创建好的项目中,首先需要创建本项目所需要的包,用于分类存放该项目的代码文件。resources文件夹用于存放项目的资源文件,包括mybatis的配置文件、Spring配置文件、SpringMVC配置文件和数据库属性配置文件;src.com.bysj包下用于存放该项目的源代码文件,包括controller包、dao包、service包、entity包(前台实体和数据库表对应实体)、util包(存放工具类文件)、framework包(异常文件);WebContent文件夹用于存放静态文件(包括CSS文件、js文件、img文件、layui文件)、uploadFiles文件(用于存放上传的文件和模板文件);

WEB-INF文件夹下用于存放jsp文件、该项目用到的类库文件和web.xml。项目包结构如图5-1所示。

 

图5-1 项目包结构

5.2系统框架的实现

本系统使用SSM(Spring、SpringMVC和Mybatis)框架实现,首先在mybatis-config.xml中对Mybatis进行配置,然后在applicationContext.xml文件中配置Spring框架并将mybatis框架整合到Spring配置文件中,在applicationContext-mvc.xml中配置SpringMVC框架,最后在web.xml中将applicationContext.xml引入并配置applicationContext-mvc.xml的servlet。

5.5.1Mybatis框架实现

Mybatis框架实现的关键代码的配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--settings:用于配置MyBatis的运行时方式。-->
    <settings>

<!--开启驼峰转换-->
       <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>
    <typeAliases>
       <package name="com.bysj.entity" />
    </typeAliases>
    <!--plugins:配置拦截器,用于拦截sql语句的执行。-->
    <plugins>
       <!--分页插件-->
       <plugin interceptor="com.github.pagehelper.PageInterceptor">
          <property name="rowBoundsWithCount" value="true" />
          <property name="reasonable" value="true" />
       </plugin>
    </plugins>
</configuration>

5.5.2Spring框架实现

(1)数据源配置文件

数据源配置文件里存放着数据源的url、驱动名称、数据库连接用户名称、密码的信息,代码如下:

url=jdbc:mysql://127.0.0.1:3306/bysjglxt1?userSLL=true&useUnicode=true

&characterEncoding=utf8
driverClassName:com.mysql.jdbc.Driver
username:root
password:root1

(2)Spring框架的配置

Spring框架实现的关键代码的配置:

<!-- 启用注解 -->
<context:annotation-config />
<context:component-scan base-package="com.bysj">
   <context:exclude-filter type="annotation"
      expression="org.springframework.stereotype.Controller" />
   <context:exclude-filter type="regex" expression="com.bysj.aop.*" />
</context:component-scan>
<!--读取配置文件-->

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
   <property name="locations">  
    <list>  
            <value>classpath:dbconfig.properties</value>
       </list>  
   </property>  
</bean>
<!-- 阿里 druid数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">  
        <!-- 数据库基本信息配置 -->
        <property name="url" value="${url}" />  
        <property name="username" value="${username}" />  
        <property name="password" value="${password}" />  
        <property name="driverClassName" value="${driverClassName}" />
</bean>

(3)Spring框架与Mybatis框架整合代码

将Mybatis整合到Spring中,其配置文件的代码如下:

<!-- 配置mybatis -->

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

    <property name="dataSource" ref="dataSource" />

<property name="configLocation"

value="classpath:mybatis/mybatis-conf  ig.xml"></property>

    <!-- mapper扫描 -->

<property name="mapperLocations" value="classpath:mybatis/*/*.xml">

</property>

</bean>

<bean id="sqlSessionTemplate"

class="org.mybatis.spring.SqlSessionTemplate">

    <constructor-arg ref="sqlSessionFactory" />

</bean>

<!--mybatis自动扫描mapper-->

<bean  class="org.mybatis.spring.mapper.MapperScannerConfigurer">

    <property name="basePackage" value="com.bysj.dao"/>

<property name="sqlSessionTemplateBeanName"

value="sqlSessionTemplate"/>

    <property name="annotationClass" value="org.springframework.stereotype.Repository"/>

</bean>

5.5.3SpringMVC框架实现

SpringMVC框架的代码配置如下:

<!--启动注解-->

<mvc:annotation-driven/>

<!--放行静态资源-->

<mvc:default-servlet-handler/>

<!--启动动态代理-->

<aop:aspectj-autoproxy proxy-target-class="true" />

<context:component-scan base-package="com.bysj.controller" />

<context:component-scan base-package="com.bysj.aop" />

<!-- 配置SpringMVC的视图解析器 -->

<bean class="org.springframework.web.servlet.view

.InternalResourceViewResol ver">

<property name="prefix" value="/WEB-INF/jsp/"/>

<property name="suffix" value=".jsp"/>

</bean>

5.5.4web.xml文件的配置

将配置好的Spring配置文件和SpringMVC的配置文件配置到web.xml文件中,代码如下:

(1)Spring配置文件的引入

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:spring/ApplicationContext.xml</param-value>

</context-param>

<!--Spring监听器,使spring随tomcat一起启动-->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener>

(2)在web.xml中配置SpringMVC的servlet:

<servlet>

<servlet-name>springMvc</servlet-name>

<servlet-class>

org.springframework.web.servlet.DispatcherServlet

</servlet-class>

<init-param>

<param-name>contextConfigLocation</param-name>

  <param-value>

classpath:spring/ApplicationContext-mvc.xml

</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>springMvc</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

5.3代码设计模块

5.3.1实体

在包com.bysj.entity.po下创建数据库表对应的12个持久化对象,在resources/mybatis/mapper路径下创建对应的Mapper映射文件,如图5-2所示。

 

 

 

 

 

 

 

 

 
   

图5-2 po包和mapper包结构

其中teacher(教师)实体的代码实现如下:

package com.bysj.entity.po;

import java.io.Serializable;

public class Teacher implements Serializable{

    private static final long serialVersionUID = 92833768095169162L;

    private String Tid;

    private String Tname;

    private String Tpwd;

    private String sex;

    private String college;

    private String major;

    private String rank;

    private String researchArea;

    private String telephone;

    private String Email;

    public static long getSerialVersionUID() {

        return serialVersionUID;

    }

    public String getTid() {

        return Tid;

    }

    public void setTid(String tid) {

        Tid = tid;

    }

    public String getTname() {

        return Tname;

    }

    public void setTname(String tname) {

        Tname = tname;

    }

    public String getTpwd() {

        return Tpwd;

    }

    public void setTpwd(String tpwd) {

        Tpwd = tpwd;

    }

    public String getSex() {

        return sex;

    }

    public void setSex(String sex) {

        this.sex = sex;

    }

    public String getCollege() {

        return college;

    }

    public void setCollege(String college) {

        this.college = college;

    }

    public String getMajor() {

        return major;

    }

    public void setMajor(String major) {

        this.major = major;

    }

    public String getRank() {

        return rank;

    }

    public void setRank(String rank) {

        this.rank = rank;

    }

    public String getResearchArea() {

        return researchArea;

    }

    public void setResearchArea(String researchArea) {

        this.researchArea = researchArea;

    }

    public String getTelephone() {

        return telephone;

    }

    public void setTelephone(String telephone) {

        this.telephone = telephone;

    }

    public String getEmail() {

        return Email;

    }

    public void setEmail(String email) {

        Email = email;

    }

}

5.3.2数据访问层(dao)

Dao包下存放着用于与数据库交互的接口,每一个接口对应一个mapper.xml映射文件,在mapper.xml文件中存放着接口中未实现的方法对应的sql语句,从而实现对数据库的操作,dao包的结构如图5-3所示。

 

 
   

图5-3 Dao包的结构图

5.3.3业务逻辑层(service)

业务逻辑层通过调用数据访问层的对象获得操作所需要的数据,然后通过一定的业务逻辑,对获得的数据进行处理,将处理的结果返回给controller层。包的结构图如图5-4所示。

 
   

图5-4 业务逻辑层包的结构图

5.3.4控制层(controller)

 

 
   

控制层是用户请求与业务逻辑中间的桥梁,负责拦截各种跳转页面,将通过调用service层的方法来对用户请求进行处理,将结果返回给用户。控制层的包的结构如图5-5所示。

图5-5 控制层的包图

5.4系统通用模块

为了保证整个网站的页面风格相同,我们将网站导航栏和菜单栏设置为网站通用模块,无论跳转到哪个页面都可以对其进行引用。

(1)导航栏header.jsp

导航栏页面用于存放网站标志信息、用户登录、退出、个人资料以及修改密码的按钮,部分主要代码如下所示:

<header class="layui-header header" style="background-color: #393D49">

    <div class="layui-nav-item">

        <img src="statics/img/logo.jpg" style="margin-left: 30px">

        <img src="statics/img/hpu.jpg" style="margin-left: 10px">

        <img src="statics/img/bkbysjglxt.jpg" style="margin-left: 180px">

    </div>

    <ul class="layui-nav layui-layout-right">

        <c:choose>

            <c:when test="${!(empty sessionUser)}">

                <li class="layui-nav-item">

                    <a href="javascript:;">

                        欢迎登录

                        <c:if test="${loginType eq 'student'}">

                            ${sessionUser.sname}

                        </c:if>

                        <c:if test="${loginType eq 'teacher'}">

                            ${sessionUser.tname}

                        </c:if>

                    </a>

                    <dl class="layui-nav-child">

                        <dd>

<a href="toMyInformation" target="main-content" >基本资料</a></dd>

                        <dd>

<a href="toResetPassword" target="main-content">修改密码</a></dd>

                        <dd><a href="logout">退出</a></dd>

                    </dl>

                </li>

            </c:when>

            <c:otherwise>

                <li class="layui-nav-item" id="toLogin">

                    <a href="javascript:">登录</a>

                </li>

            </c:otherwise>

        </c:choose>

    </ul>

</header>

(2)菜单栏left.jsp

菜单栏根据用户角色的不同会展示不同的功能模块,供用户使用。当用户为学生时,其内容是主页、选择课题、我的任务、开题报告、中期检查、毕业论文、我的成绩;当用户为指导教师时,其内容是:申报课题、我的学生、我的课题;当用户为评阅教师时,其内容是:评阅管理;当用户是专业负责人时,其内容是:课题审批、答辩成绩录入、成绩分析;当用户是管理员时,其内容是:教师管理、学生管理、公告管理、文件管理、志愿管理和课题管理。部分主要代码如下:

<nav class="layui-side layui-bg-black">
    <div class="layui-side-scroll">
        <!-- 左侧导航菜单栏 -->
        <ul class="layui-nav layui-nav-tree"  >
            <li class="layui-nav-item">
                <a href="<%=basePath%>main/page"

target="main-content">
                    <i class="layui-icon"></i>
                    <cite>主页</cite>
                </a>
            </li>
            <c:forEach items="${sessionScope.sideMenuList}"

var="menu">
                <li class="layui-nav-item">
                    <a href="${menu.menuUrl}" target="main-content">
                        <i class="layui-icon"></i>
                        <cite>${menu.menuName}</cite>
                    </a>
                </li>
            </c:forEach>
        </ul>
    </div>
</nav>

5.5用户登录模块

 

 
   

系统中的用户角色包括教师(指导教师、评阅教师、专业负责人、系统管理员)角色和学生角色,用户在登录系统前需要选择用户角色,登录后系统会根据用户角色跳转到相应的系统模块,所有的用户均需要输入用户名、密码以及验证码,为了保证个人账户的安全性,用户登录后可以进入修改密码页面对密码进行修改,在成功登录系统前,系统会通过调用数据库查询是否存在该用户,如果用户输入的信息正确,会跳转到网站首页,否则会提示错误信息,用户登录的流程图如图5-6所示。

图5-6 用户登录的流程图

登录界面设计如图5-7所示。

图5-7 登录界面

用户点击登录,系统会调用login.js和header.jsp来显示登录界面,用户根据提示选择角色,输入账号、密码以及验证码,点击“登录”按钮,系统会将数据传输到loginController.java页面,在该页面首先对验证码进行判断,如果验证码为空或者错误,向前台输出验证码错误提示框,否则,会根据角色调用相应的service层方法(教师调用TeacherService类的getTeacherByUsernameWithPwd()方法,学生调用StudentService类的getStudentByUsernameWithPwd()),service层调用Dao层方法(教师调用TeacherDao类的getTeacherByUsernameWithPwd()方法,学生调用StudentDao类的getStudentByUsernameWithPwd()),框架通过映射去mapper.xml中查找对应的SQL在数据库中查询,如果存在这样的用户,则跳转到系统首页mainPage.jsp,如果不存在,则提示用户名或密码错误的提示框。

登录功能的主要代码如下:

LoginController.java中的代码:

public ResultBean login(@RequestParam("username") String username,

                    @RequestParam("password") String password,

                    @RequestParam("code") String code,

                    @RequestParam("type") String loginType)

throws LoginException {

String sessionCode = (String)session.getAttribute(Const.SESSION_SECU RITY_CODE);

//测试验证码

if(!sessionCode.equalsIgnoreCase(code)&& Tools.notEmpty(sessionCode)) {

throw new UserIllegalOperatorException("验证码错误");

}

Object user = null;

   if (!StringUtil.noEmpty(username,password,loginType)){

    return null;

   }

   if (loginType.equals("student")){

      user = studentService.getStudentByUsernameWithPwd(username,

password);

   }else {

      user = teacherService.getTeacherByUsernameWithPwd(username,

password);

   }

   //不存在该用户

   if (user == null){

      throw new AuthenticationException("账号或密码错误");

   }

//向session中放入用户数据

   session.setAttribute(Const.SESSION_USER,user);

   session.setAttribute(Const.LOGIN_TYPE,loginType);

   session.setAttribute(Const.SESSION_sideMenuList,

menuService.getMenuByUsername(username));

   return new ResultBean();

}

5.6教师模块实现

5.6.1申报课题管理模块

教师登录系统后,点击“申报课题按钮”,系统会跳转到申报课题页面,教师可以在该页面中填入课题名称、指定学生(如果申请指定课题的学生时)、选择课题类型、填写课题描述,点击“提交”按钮,即可成功提交课题信息,系统将在数据库的课题表(title表)将会插入一条记录。该课题信息界面如图5-8所示。

 

 
   

图5-8 申报课题界面

成功添加的课题后,指导教师可以在我的课题模块中查看,界面如图5-9所示。

 

 

 

 

 
   

图5-9 我的课题界面

点击【查看】按钮,可以查看申请课题的详细信息,如图5-10所示。

 

 
   

图5-10 课题详情页

点击【编辑】按钮,可以修改已申报课题,如图5-11所示。

 

 
   

图5-11 修改课题界面

添加课题信息主要代码如下:

(1)applyTittle.jsp页面的代码:

function applyTitle(text) {
    $.ajax({
        url : 'tec/applyTitle',
        type : 'post',
        dataType :'json',
        data : {
                titleName : $("input[name=titleName]").val(),
                kind : type,
                problemDesc : text,
                sno : $("#stu-sno").val()
        },
        success:function (data) {
            if(data.code == ‘1’){
                layer.msg("成功添加申请课题");
            }
        },
        error : function () {
            layer.msg("连接服务器异常");
        }
    });
}

(2)TeacherController.java代码:

@Autowired
private HttpSession session;

@Autowired
private TitleService titleService;

@PostMapping("applyTitle")
@ResponseBody
public ResultBean<Integer> applyTitle(Title title, String sno) {
Teacher teacher = (Teacher) session.getAttribute(Const.SESSION_USER);     title.setTid(teacher.getTid());
title.setTitleId(Sequence.nextId());
return new ResultBean<>(titleService.applyTitle(title, sno));
}

⑶TitleService.java代码:

@Autowired
private TitleDao titleDao;

public int applyTitle(Title title,String sno){

List<Title> titleList = titleDao.getTitlesByTid(title.getTid());
//检查老师是否有重复课题(判断判断是否相等时只考虑内容,不考虑ID和审批状态)
if (titleList != null){
    for (Title existTitle : titleList){
        if (existTitle.equals(title)){
            throw new MultipleExistenceException("课题已经存在,请不要重复申请");
        }
    }
}

if (!StringUtil.isEmpty(sno)){
    titleDao.insertS_T(sno,title.getTitleId(),null);
}

return titleDao.addTitle(title);
}

(4)TitleMapper.xml代码:

<insert id="addTitle" >
    INSERT title
    (
    titleId,
    titleName,
    Tid,
    problem_desc,
    kind,
    T_state
    )
    VALUES(
    #{title.titleId,jdbcType = BIGINT},
    #{title.titleName},
    #{title.Tid},
    #{title.problemDesc},
    #{title.kind},
    #{title.TState,jdbcType = VARCHAR}
    )
</insert>

5.6.2审批课题管理模块

 

 
   

专业负责人登录系统,通过点击左侧菜单栏中的【审批课题】,在内容区域将会展现该专业教师申请的课题列表,专业负责人可以在该页面中查看到该专业所有教师申请的课题详细信息(包括课题名称、教职工号、教师姓名、查看课题以及审批),将符合专业培养目标的课题审批通过,不符合专业培养目标的课题驳回,界面如图5-12所示。

图5-12 审批课题

 

 
   

专业负责人点击“同意”按钮,该课题即可审批通过,指导教师可以在“我的课题”中查看此课题的审批状态,界面如图5-13所示。

图5-13 审批通过界面

 

 
   

专业负责人点击“驳回”按钮,该课题的状态将会显示未通过,该课题将不能够被学生选择,界面如图5-14所示。

图5-14 选题驳回界面

审批课题主要代码如下:

(1)approve_list.jsp页面:

<div class="layui-card-header">
    <span>课题列表</span>
</div>
<div class="layui-card-body">
    <div name="content" style="text-align: center">
        <table id="titleList" lay-filter = 'titleTable'></table>
        <div class="layui-table-page" id="titleListPage"></div>
    </div>
    <div class="btn-group" style="text-align: right">
        <button class="layui-btn layui-btn-disabled"

disabled id="batch-approve-btn">批量通过</button>
        <button class="layui-btn layui-btn-disabled"

disabled id="batch-reject-btn">批量驳回</button>
    </div>
</div>

<script>
    var cols = [[
        {type: 'checkbox', fixed: 'left'},
        {field: 'titleName', title: '题目名称'},
        {field: 'tid', title: '教职工号'},
        {field: 'tname', title: '教师姓名'},

{field: 'titleDetail', title: '查看课题', align: 'center', templet: "#detail-btn",  event: 'detail'},
        {field: 'approve', title: '审批', align: 'center', templet: "#operation-btn", event:   'stateSwitch'}
    ]];

function initTable(id,url,cols,successFunction) {
    return laytable.render({
        elem: '#' + id,
        url: url,
        page: {
            groups: 10
        },
        request: {
            pageName: 'pageNum',
            limitName: 'pageSize'
        },
        response: {
            statusName: 'code',
            statusCode: 1,
            msgName: 'message',
            countName: 'total',
            dataName: 'list'
        },
        cols: cols,
        done: successFunction
    });
}
$(document).ready(function () {
   //加载表格,数据
   initTable("titleList", '<%=basePath%>tec/approveList', cols,

tableSuccess);

}

(2)TeacherController.java页面的代码:

@Autowired
private TeacherService teacherService;

@RequestMapping(value="approveList")
public @ResponseBody Table<Title> approveList(int pageSize, int pageNum,Title title){
    Page page=new Page();
    page.setPageNum(pageNum);
    page.setPageSize(pageSize);
    return new Table<>(teacherService.getATitleList(page,title));
}

(3)TeacherService.java页面的代码:

@Resource(name = "teacherDao")
private TeacherDao teacherDao;

public PageInfo<Title> getATitleList(Page page,Title title){
    PageHelper.startPage(page.getPageNum(),page.getPageSize());
    List<Title> titleList=teacherDao.getATitleList(title);
    return new PageInfo<>(titleList);
}

(4)TeacherMapper.xml页面的代码如下:

<select id="getATitleList" resultType="title">
     SELECT
       tt.*,
       cct.TYPE_NAME as kindName,
       te.Tname
    FROM title tt,code_currency_type cct,teacher te
    where ISNULL(T_state)  and cct.TYPE_ID=tt.kind and te.Tid=tt.Tid
</select>

5.6.3我的学生模块

 

 
   

指导教师点击“我的学生”,页面会展示出指导学生列表,教师可以通过在线查看辅导学生的开题报告和中期检查,下载毕设论文,还可以点击任务管理,对学生毕设进行辅导,我的学生界面如图5-15。

图5-15 我的学生界面

点击“任务管理”下面的按钮,会跳转到图5-16所示的界面,对学生进行指导(可以留言和上传文件)

 

 

 

 

 

 

 

 

 

 

 
   

图5-16 任务管理界面

点击开题报告(或中期检查),将会展示学生提交的开题报告(或中期检查),教师可以对其进行批阅,并下载,如图5-17所示。

 

 
   

图5-17开题报告界面

我的学生模块的核心代码如下:

(1)教师指导(留言)模块代码

studentDetail.jsp页面的代码:

<div name="guide-area">

    <label class="layui-label">指导建议:</label>

    <ul class="comments-ul">

        <c:forEach items="${openReportComments}" var="comment">

            <li>

                <div class="layui-card">

                    <div class="layui-card-header comments-header">

                        <span><fmt:formatDate

value="${comment.createDate}"

pattern="yyyy 年 MM 月 dd 日

hh:mm:ss" />

</span>

                        <span name="sender-info">

{comment.sender.name}</span>

                        <c:if test="${!empty comment.file.fid}">

                            <span style="float: right">

<a href="files/downloadFile?

fileId=${comment.file.fid}" >

点击下载附件

</a>

</span>

                            <span name="file-href" style="float: right"> ${comment.file.fileName}

</span>

                        </c:if>

                    </div>

                    <div class="layui-card-body comments-content">

                            <span>${comment.content}</span>

                    </div>

                    <hr class="layui-bg-green">

                </div>

            </li>

        </c:forEach>

    </ul>

</div>

function commitComments(files) {

    var comment = {

        billId: billId,

        type: type,

        content: $("#comment-content").val(),

        senderId: $("#tid").val()

    };

    if (files){

        comment['attachmentId'] = files.fid;

    }

    $.ajax({

        url: 'tec/addComments',

        type: 'post',

        dataType: 'json',

        data:comment,

        success: function (data) {

            if (data.code == 1){

                layer.msg("发布成功");

                window.location.reload();

            }else{

                layer.msg(data.message);

            }

        }

    });

}

var uploadInst = upload.render({

         elem: '#add-file-btn' //绑定元素

        ,url: 'files/uploadFile' //上传接口

        ,accept: 'file'

        ,auto: false

        ,bindAction : '#commit-file-btn'

        ,data:{

             fileType : 'common'

        }

        ,choose: function(obj){

            //将每次选择的文件追加到文件队列

            var files = obj.pushFile();

            //预读本地文件,如果是多文件,则会遍历。

            obj.preview(function(index, file, result){

                $("#file-name").text(file.name);

            });

        }

        ,done: function(res){

             if (res.code == 1){

                 commitComments(res.data);

             }else{

                 layer.msg("上传文件失败:"+res.message);

             }

            $("#file-name").text('');

        }

        ,error: function(){

            $("#file-name").text('');

            layer.msg("上传附件失败,请重新上传");

        }

});

FileService.java中保存文件代码:

public Files saveFile(MultipartFile multipartFile) throws IOException {

        if (multipartFile.isEmpty()){

            return null;

        }

        String sourceName = multipartFile.getOriginalFilename();

        //生成随机的保存名称

        String savePath = Const.FILE_SAVE_PATH +

UuidUtil.get36UUID()+

sourceName.substring(

sourceName.lastIndexOf(".")) ;

        //构建文件类的信息

        Files files = new Files();

        files.setUploadDatetime(new Date());

        files.setFileSize(multipartFile.getSize());

        files.setFileName(multipartFile.getOriginalFilename());

        files.setFilePath(savePath);

        //保存文件

        File outFile = new File(savePath);

        if (!outFile.exists()){

            outFile.createNewFile();

        }

        multipartFile.transferTo(outFile);

        return files;

 }

5.6.4评阅管理模块

 

 
   

专业负责人点击【评阅管理】,进入评阅管理界面,点击分配评阅教师,系统将自动为该专业教师分配待评阅的学生,专业负责人可以在该页面下载该专业学生的毕设论文进行查看,修改评阅成绩和评语,评阅教师通过点击【评阅管理】,进入评阅管理页面,查看本人的待评阅学生,下载学生毕设论文进行查看,给出成绩和评语,专业负责人评阅管理界面如图5-18所示。

图5-18 评阅管理界面

评阅教师模块核心代码如下:

/**

 * 给教师分配评阅学生

 *分配逻辑:对所有老师进行随机排序,排序后按照顺序,前一个审批后一 个老师的学生,以此类推

 * @return 返回分配结果,boolean值

 */

public boolean allocateReview(String major){

    Teacher filter = new Teacher();

    filter.setMajor(major);

    //获取所有老师

    List<Teacher> teacherList = teacherDao.listPageTeacher(filter);

    //对老师进行随机排序

    randomSortList(teacherList);

    int size = teacherList.size();

    //按照随排后的顺序由前到后交换学生

    for (int i = 0; i < size; i++) {

        Teacher teacher = teacherList.get(i);

        Teacher nextTeacher = teacherList.get((i+1)%size);

        //获取下一个老师的学生

        List<Student> studentList = studentDao.getStudentsByTid(

nextTeacher.getTid());

        //分配给当前老师,向数据库中插入数据

        studentList.forEach(a -> {

            Review review = new Review();

            review.setTid(teacher.getTid());

            review.setReviewId(Sequence.nextId());

            review.setSno(a.getSno());

            reviewDao.addReview(review);

        });

    }

    return true;

}

private void randomSortList(List<?> list){

    for (int i = 0; i < 20; i++) {

        list.sort((a, b) -> (int) Math.round(Math.random() * 20 - 10));

    }

}

5.6.5答辩成绩管理模块

 

 
   

专业负责人通过点击【答辩成绩管理】,进入答辩成绩管理界面,录入该专业学生的答辩成绩以及评语,点击保存即可成功提交到后台数据库,答辩成绩录入的界面如图5-19所示。

图5-19 答辩成绩录入界面

5.6.6成绩分析模块

专业负责人点击左边菜单栏中的“成绩分析”,页面将会展现出该专业学生的学号、姓名、题目、平时成绩、评阅成绩、答辩成绩以及总成绩,同时系统自动对该专业的成绩进行分析,展示该专业学生的成绩正态分布图以及饼图,方便教师进行统计分析,成绩分析界面如图5-20所示。

 

 
   

图5-20 成绩分析界面

成绩分析的核心代码如下:

/**

 * 获取数据分析所需的数据

 * 共有两组数据,原始数据和处理正态分布后的数据

 * 对所有成绩进行分组

 * @return 返回值为一个二维数据(为了操作方便,使用二维集合)

 */

public Map<String,List<List<Double>>> getScoreAnalysisData(){

    Map<String,List<List<Double>>> result = new HashMap<>();

    List<StuScore> stuScoreList = Optional.ofNullable(teacherDao.getStuAll Score()).orElse(new ArrayList<>());

    //按照成绩进行分组

    Map<Double,Long> scoreMap = stuScoreList.stream()

            .map(StuScore::getTotalScore)

            .collect(groupingBy(Double::doubleValue,counting()));

    List<List<Double>> originalData = new ArrayList<>();

    scoreMap.forEach((key,value)->{

        List list = new ArrayList();

        list.add(key);

        list.add(value);

        originalData.add(list);

    });

    result.put("or",originalData);

    result.put("nd",getNormalDistributionData(stuScoreList));

   return result;

}

/**

 * 对成绩进行正态分布分析

 * @return

 */

private List<List<Double>> getNormalDistributionData(List<StuScore> score List){

    List<List<Double>> result = new ArrayList<>();

    double average = scoreList.stream().mapToDouble(StuScore::getTotalSco  re).average().orElse(0);

    //方差

    double variance = scoreList.stream()

            .mapToDouble(stuScore ->Math

.pow(stuScore.getTotalScore() - average,2)).average()

                    .orElse(0);

    //生成函数

    NormalDistribution normalDistribution = new NormalDistribution(

average,Math.sqrt(variance));

    //计算成绩从1到100的值,形成二维集合

    for (double i = 1;i<=100;i+=2){

        List<Double> item = new ArrayList<>();

        item.add(i);

        item.add(normalDistribution.density(i));

        result.add(item);

    }

    return result;

}

5.7学生模块实现

5.7.1选择课题模块

 

 
   

学生登录成功后,选择“选择课题”模块,即可进入到选题管理界面,该页面展示了本专业教师申请的所有待选课题的信息,包括题目编号、名称、教师名称、题目详情,学生可以根据个人爱好选择课题,选题管理的界面如图5-21所示。

图5-21 选题管理界面

5.7.2我的任务模块

 

 
   

学生选择的课题审核通过后,即可在【我的任务】模块在线提交开题报告、中期检查并以文件形式上传毕设论文,也可以在该区域与指导教师交流,得到教师的指导,对提交的内容进行改善,我的任务界面如图5-22所示。

图5-22 我的任务界面

点击【去提交】跳转到开题报告编辑页面,学生可以在该界面在线编辑开题报告,编辑完成后的界面如图5-23所示。

 

 

 

 

 

 

 

 

 

 
   

图5-23 开题报告编辑界面

编辑完成后,点击查看,可以查看开题报告,对开题报告进行下载,如图5-24所示。

 

 
   

图5-24 开题报告提交后的界面

文档下载核心代码:

@RequestMapping(value="convertWordFile")

public ResponseEntity<byte[]> convertWordFile(String type,String id) throws Exception {

    Object article = null;

    String templateName = "";

    if ("openReport".equals(type)){

        article = openReportService.getOpenReportById(

new BigInteger(id));

        templateName = Const.OPEN_REPORT_TEMPLATE;

    }else if ("midExam".equals(type)){

        article = midExamService.getMidExamById(new BigInteger(id));

        templateName = Const.MID_EXAM_TEMPLATE;

    }

    WordConvertBean convertBean = new WordConvertBean(article,

templateName);

    //读入文件

    InputStream inputStream = convertBean.getInputStream();

    byte[] buffer = new byte[inputStream.available()];

    inputStream.read(buffer);

    //构建返回对象

    HttpHeaders httpHeaders = new HttpHeaders();

    httpHeaders.add("Content-Disposition","attachment;fileName="+type

+".docx");

    return new ResponseEntity<byte[]>(buffer,httpHeaders, HttpStatus.OK);

}

//\s表示任意空白字符,\S表示任意非空字符。

private static final String regex = "[\\s\\S]*\\$\\{\\s*\\S+\\s*}[\\s\\S]*";

@Override

public File convert(String fileName){

    if (StringUtil.isEmpty(fileName)){

        fileName = UuidUtil.get32UUID();

    }

    outFile = new File(outPath+fileName+".docx");

    try (FileOutputStream outputStream = new FileOutputStream(outFile)){

        outFile.createNewFile();

        replaceAllTableTxt(xwpfDocument,valueMap);

        xwpfDocument.write(outputStream);

    } catch (Exception e) {

        e.printStackTrace();

    }

    return outFile;

}

private void replaceAllTableTxt(XWPFDocument document,Map<String,Strin g> values){

    for (XWPFTable xwpfTable : document.getTables()) {

        for (XWPFTableRow row : xwpfTable.getRows()) {

            for (XWPFTableCell cell : row.getTableCells()) {

                for (XWPFParagraph paragraph : cell.getParagraphs()) {

                    StringBuilder paragraphText = new StringBuilder();

                    for (XWPFRun run : paragraph.getRuns()) {

                        paragraphText.append(run.getText(run

.getTextPosition()));

                    }

                    //段落中含有变量,进行替换

                    if (paragraphText.toString().matches(regex)) {

                        String newText = replaceVariable(paragraphText

.toString(), values);

                        //清空段落

                        clearParagraph(paragraph);

                        //创建新的文本

                        paragraph.createRun().setText(newText,0);

                    }

                }

            }

        }

    }

}

//将段落中的变量替换

private String replaceVariable(String oldText,Map<String,String> values){

    String result = "";

    for (String key : values.keySet()) {

        if (oldText.matches("[\\s\\S]*"+getVariableRegex(key)+"[\\s\\S]*")){

            result = oldText.replaceAll(getVariableRegex(key),StringUtil

.orElse(values.get(key),""));

        }

    }

    return result;

}

/**

 * 清空段落

 * @param paragraph

 */

private void clearParagraph(XWPFParagraph paragraph){

    List<XWPFRun> runList = paragraph.getRuns();

    for (int i=0;i<runList.size();i++){

        runList.get(i).setText("",0);

        paragraph.removeRun(i);

    }

}

private String getVariableRegex(String variableName){

    return "\\$\\{\\s*"+variableName+"\\s*}";

}

5.7.3我的成绩模块

学生进入“我的成绩”模块后,可以在该界面查看自己的平时成绩、评阅成绩、答辩成绩以及总成绩,我的成绩界面如图5-25所示。

 

 
   

图5-25 我的成绩界面

5.8管理员模块实现

5.8.1教师管理模块

管理员可以在教师管理模块对教师的信息进行维护,还可以为教师分配角色(指导教师、专业负责人和系统管理员),教师管理的界面如图5-26所示。

 
   

图5-26 教师管理界面

5.8.2学生管理模块

管理员可以在学生管理模块对学生信息进行维护,学生管理界面如图5-27所示。

 
   

图5-27 学生管理界面

5.8.3志愿管理模块

志愿管理界面展示了学生的志愿信息,管理员可以对审批状态进行修改,也可以删除学生的志愿,志愿管理界面如图5-28所示。

 

 
   

图5-28 志愿管理界面

5.8.4课题管理模块

课题管理界面展示了课题编号、题目名称、指导教师姓名、审批状态以及其申报的课题信息,管理员可以对其进行修改和删除,课题管理界面如图5-29所示。

 

 
   

图5-29 课题管理界面

5.8.5公告管理模块

公告管理界面展示了公告的基本信息,管理员可以对该系统的公告信息进行维护,公告管理界面如图5-30所示。

 

 

 

 
   

图5-30 公告管理界面

5.8.6文件管理模块

文件管理界面展示了该系统的数据库中的所有文件(包括模板文件、往届优秀毕业论文、学生上传的论文以及附件),在该界面管理员可以上传模板文件以及往届优秀毕业论文,可以删除所有类型的文件,文件管理界面如图5-31所示。

 

 
   

图5-31 文件管理界面

 

6.系统测试

6.1系统的调试

系统调试是在程序编制完成以后,在计算机上按照系统设计的要求,以各种可能的数据和操作条件对新开发实现的系统进行试验,找出系统内部存在的问题加以修改,使其真正达到设计要求[5]。在软件开发过程中,虽然有IDEA强大的开发工具帮助我们开发程序,帮我们自动导包、代码提示、编译错误提示等等,但是有一些逻辑错误(例如SQL关键字的冲突、SQL语句的错误、数据库字段长度设计过小不能容纳用户输入的数据、文件路径错误、数据库插入多条重复数据导致用户查询结果与预设的类型不同从而导致的错误等等),IDEA并不能帮我们解决,这时需要通过日志文件中打印输出的错误提示,分析错误来源,从而有针对性的解决程序中出现的Bug。

6.2系统的测试

6.2.1测试的重要性及目的

在IEEE(美国电气和电子工程师协会)提出的软件工程术语中,软件测试被定义为“使用人工手段运行或测试某个模块的过程,其目的在于检验它是否达到预期的结果[7]。”软件测试的目的是在软件投入生产运行之前,尽可能多地发现软件中的错误,并对错误的程序进行修改[12],否则等到系统投入运行后再回头改正错误将在人力、物力上造成很大的浪费,有时甚至导致整个系统的瘫痪。

6.2.2测试方法

系统测试方法总的来说有静态测试法(桌前检查、代码会审)和动态测试法(黑盒法、白盒法)两种[5]。本系统在开发过程中采用静态测试法来分析和测试程序,以找出逻辑错误,完成一个功能模块之后,通过黑白盒测试相结合的方法对代码进行测试[12],当发现程序运行结果和预期结果不同时,通过调试,来定位错误来源,从而解决程序中出现的Bug,最后将程序的所有的模块实现之后,将所有的模块集成到一起,进行集成测试,通过与需求分析对比,查看测试结果是否正确,从而完成整个系统的测试。

6.3登录功能模块测试

功能测试的目标是确保本科毕业设计管理系统的各个功能能够正常运行,通过输入有效的数据,可以得到正确的结果,输入无效的数据,会得到错误提示。

本系统通过将登陆模块的所有可能情况进行全面考虑,测试该功能是否符合需求分析以及系统设计的要求,登录功能模块的测试用例如表6-1所示。

表6-1 登录功能模块的测试用例

编号

测试数据

预期结果

用户名

密码

验证码

1

Admin

1

KGG0

显示登录成功,进入管理员界面

2

20180526

0180526

6XYT

显示登录成功,进入教师界面

3

311409030202

2018

13CG

显示登录成功,进入学生界面

4

显示用户名不能为空

5

311409030202

显示密码不能为空

6

311409030202

2018

显示验证码不能为空

7

311409030202

1

W40U

显示用户名或密码错误

8

311409030202

2018

b

显示验证码错误

第一步:测试管理员角色登录功能

(1)测试内容:选择教师角色,按页面提示输入管理员的用户名和密码,点击【登录】,能跳转到管理员界面。

(2)确认方法:目测。

(3)测试过程:

在如图6-1所示的页面中,输入用户名:“admin”、密码:“1”、验证码:“KGG0”,点击【登录】按钮后,进入管理员界面,如图6-2所示。

 

 
   

图6-1 登录界面

 

 

 

 

 

 

 

 

 
   

图6-2 管理员登录成功界面

(4)测试结论:合格。

第二步:测试教师角色(专业负责人)登录功能

(1)测试内容:选择教师角色,按页面提示输入教师的登录信息,点击【登录】,能跳转到教师界面。

(2)确认方法:目测。

(3)测试过程:

在如图6-1所示的页面中,输入用户名:“20180526”、密码:“0180526”、验证码:“6XYT”,点击【登录】按钮后,进入教师界面,如图6-3所示。

 
   

图6-3 教师登录成功界面

(4)测试结论:合格。

第三步:测试学生角色(专业负责人)登录功能

(1)测试内容:选择学生角色,按页面提示输入学生的登录信息,点击【登录】,能跳转到学生界面。

(2)确认方法:目测。

(3)测试过程如下:

在如图6-4所示的页面中,输入用户名:“311409030202”、密码:“2018”、验证码:“13CG”,点击【登录】按钮后,进入学生界面,如图6-5所示。

 

 
   

图6-4 学生登录界面

 

 
   

图6-5 学生登录成功界面

(4)测试结论:合格。

第四步:测试空的用户名登录功能

(1)测试内容:用户名为空时,点击【登录】按钮,显示用户名不能为空的错误提示信息。

(2)确认方法:目测。

(3)测试过程:

在登录窗口中,不输入任何信息,直接点击【登录】按钮,结果如图6-6所示:

 

 

 

 
   

图6-6 用户名不能为空提示信息界面

(4)测试结论:合格。

第五步:测试空的密码登录功能

(1)测试内容:密码为空时,点击【登录】按钮,显示密码不能为空的错误提示信息。

(2)确认方法:目测。

(3)测试过程:

 

 
   

在登录窗口中,输入用户名,保证密码输入框为空,直接点击【登录】按钮,结果如图6-7所示:

图6-7 密码不能为空提示信息界面

(4)测试结论:合格。

第六步:测试空的验证码登录功能

(1)测试内容:验证码为空时,点击【登录】按钮,显示验证码不能为空的错误提示信息。

(2)确认方法:目测。

(3)测试过程:

 

 
   

在登录窗口中,输入用户名和密码,保证验证码输入框为空,直接点击【登录】按钮,结果如图6-8所示:

图6-8 验证码不能为空提示信息界面

(4)测试结论:合格。

第七步:测试用户名或密码错误登录功能

(1)测试内容(以输入错误的密码为例):输入错误的密码,点击【登录】,显示错误提示信息。

(2)确认方法:目测。

(3)测试过程:

在登录窗口中,用户名为数据库存在的用户名,密码不正确,点击【登录】,结果如图6-9所示。

 

 

 

 

 

 
   

图6-9 用户名或密码错误提示信息界面

(4)测试结论:合格。

第八步:测试验证按错误登录功能

(1)测试内容:输入错误的验证码,点击【登录】,显示验证按错误提示信息。

(2)确认方法:目测。

(3)测试过程:

 

 
   

在登录窗口中,保证用户名和密码输入框不为空,输入错误的验证码,点击【登录】,结果如图6-10所示。

图6-10 验证码错误提示信息界面

(4)测试结论:合格。

6.4课题管理功能模块测试

在课题管理模块的测试中,分别从教师申请课题和管理员对课题进行维护这两方面进行测试,测试该功能是否符合需求分析以及系统设计的要求,课题管理模块的测试用例如表6-2所示。

表6-2 课题管理模块测试

编号

测试模块

输入

预期结果

最终结果

测试结论

1

教师申请课题功能

输入课题名称、指定的学生、课题类型以及课题描述

显示成功添加申请课题

显示成功添加申请课题

合格

2

管理员修改课题功能

点击修改内容,对课题信息修改

成功修改课题信息

成功修改课题信息

合格

3

管理员删除课题功能

点击删除按钮删除某个课题

成功删除课题信息

成功删除课题信息

 

6.4选题管理功能模块测试

在选题管理模块的测试中,分别从学生选择课题和管理员对志愿进行维护这两方面进行测试,测试该功能是否符合需求分析以及系统设计的要求,课题管理模块的测试用例如表6-3所示。

表6-3 选题管理模块测试

编号

测试模块

输入

预期结果

最终结果

测试结论

1

学生选择课题功能

点击单选按钮选中课题,点击选择课题按钮提交选题信息

学生能够在我的任务页面查看课题信息,教师能够在我的学生页面查看选择每个课题的学生

学生能够在我的任务页面查看课题信息,教师能够在我的学生页面查看选择每个课题的学生

合格

3

管理员修改志愿功能

点击修改内容修改志愿信息

成功修改志愿信息

成功修改志愿信息

合格

4

管理员删除志愿功能

点击删除按钮删除某个志愿

成功删除志愿信息

成功删除志愿信息

合格

 

 

7.结论

本系统严格按照结构化系统开发方法,通过系统分析、系统设计、系统实现、系统测试等环节开发而成,实现了教师在线编辑课题、学生与教师双选、教师在线答疑、学生在线提交开题报告、中期检查、教师在线评阅开题报告、中期检查、学生在线提交论文、系统随机分配评阅教师、教师在线提交平时成绩、评阅成绩、答辩成绩以及评语、系统生成成绩的正态分布图以及饼图、下载开题报告、中期检查以及成绩单等功能。由于时间有限,系统部分非关键功能尚未实现,例如答辩分组功能以及系统可以发短信消息提示教师和学生等等,这些都是有待进一步完善的功能。

在系统开发过程中,通过查阅资料以及老师的帮助,对现阶段本校毕业设计管理工作以及规定进行了调查研究,通过构建该系统的用例图和活动图,对用户的需求进行了详细的分析,明确了该系统应该具备的功能模块,以及每个功能模块实现的业务逻辑。利用系统流程图对系统进行了总体设计,通过分析系统中涉及的实体以及实体间的联系对数据库进行了概念结构设计和逻辑结构设计,通过Navicat for MySQL工具创建了本系统所需要的表、视图以及创建表间的联系,在IDEA开发工具中搭建SSM框架、分模块创建系统所需要的包,最后按模块实现系统的功能,从而实现整个系统的开发。

本人在开发过程中,遇到了一些问题,例如:由于数据库版本较高,在执行SQL时,遇到数据库的关键字冲突,通过在关键字两端加上单引号该问题得以解决。在成绩分析模块,最初的曲线图是关于成绩与人数之间的函数,通过数据模拟发现呈现出直线的状态,不能满足实际需求;通过查阅资料发现Java第三方的函数库中有正太分布的概率密度函数NormalDistribution(),通过样本点计算出成绩的均值和方差,即可得到概率密度函数,通过设定几个点,该曲线即可在前台进行显示。在将在线文档转换为.docx文件下载的过程中,由于段落删除后,段落的个数发生变化,导致循环发生异常;在同学的提醒下,通过删除段落内容,保留段落,再在原段落中添加内容,即可实现word的转换下载。

通过这段时间的编程练习,不但将大学期间所学到的系统开发相关知识进行了灵活运用,也学会了很多编程语言和工具。虽然在系统实现时,由于本人开发经验不足,遇到了重重困难,但是在老师和同学的帮助下,度过了一个个难关,完成了此次毕业设计。通过这次系统开发,使我认识到需求分析的重要性,如果系统需求不明确,就忙于进入系统设计和开发阶段,很可能会推倒重来,浪费时间和精力。在系统开发过程中,最重要的能力就是调试能力,很多时候,程序的运行结果会和我们的想法有出入,这时一定要学会设置断点,对程序进行调试,观察各参数的值是否与预期的结果一致,从而查找出程序的逻辑错误的出处。在本次系统实现的过程中,涉及到了很多新知识,需要自学,并将其应用到系统中,这锻炼了在短时间内掌握并应用新知识的能力。总之,通过完成此次毕业设计,不但提高了本人的自学能力,同时也提高了动手能力,使本人在编程方面有了很大的进步,为今后的研究深造打下了坚实的基础。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

致谢

本毕业设计是在吴岩老师的悉心指导和严格要求下完成的。在整个过程中她给予我了很大的帮助,在论文选题方面,她首先肯定了我的选题方向,并对主要的功能模块进行详细的列举,让我对该系统有初步的认识,在系统设计和实现的过程中,每当我遇到问题时,她都能帮我认真分析,从而找到问题的解决办法。在我完成论文初稿后,老师认真审阅了我的论文,并给出指导意见,使我的论文撰写更加规范。她认真负责的工作态度、精益求精的工作作风,令我终身受益。在她的耐心帮助下,我少走很多弯路,学到了很多知识。在此,我十分感谢吴岩老师在我毕设期间给我的认真指导。

感谢曾经为我上过课的老师,是他们用精心总结的知识不断地丰富着我的头脑,在他们的认真教诲下,我学到了很多系统开发的相关知识和技术。通过四年的大学学习,使我从一个对系统开发无知的高中生不断地成长,成为一名具有较强综合素质的一名合格的大学生。

感谢我的室友,在大学四年里为我营造了一个良好的学习氛围,使我每天都对学习充满激情。感谢在系统实现过程中给与我帮助的那些同学,正是因为他们的帮助,我才能按期顺利地完成我的毕业设计。

最后,我要感谢本论文的评阅教师和答辩组的所有教师,感谢你们对本论文提出的宝贵意见,使这篇论文更加完善。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

参考文献

[1]  柏依彤.基于校园网的高校毕业设计选题系统的建模与设计[D].成都:电子科技学,2011: 1.

[2]  孟理.基于Web的本科毕业设计管理系统的设计与实现[D].河北:河北科技大学,2015:6-

8.

[3]  廖逢钗.信息工程学院专业导师制下的本科毕业设计管理系统的研究与分析[D].昆明:云 南大学,2015:3.

[4]  Craig Walls.Spring实战(第三版)[M].(耿渊、张卫滨).北京:人民邮电出版社,2013.6, 3-4.

[5]  杜鹃.信息系统分析与设计[M].北京:清华大学出版社,2014.9,67-256.

[6]  赵文涛.数据库系统与应用[M].北京:中国矿业大学出版社,2012.1,109-110.

[7]  陈泽强.基于.NET的本科毕业设计管理系统的设计与实现[D].成都:电子科技大 学,2012.61.

[8]  杨开阵.深入浅出MyBatis技术原理与实战[M].北京:电子工业出版社,2016.9,9-10.

[9]  刘珊.本科毕业设计管理系统的设计与实现[D].厦门:厦门大学,2014,35.

[10] Seth Ladd,Darren Davision,Steven Devijver,Colin Yates.深入解析Spring MVC与Web Flow[M].(徐哲,沈艳).北京:人民邮电出版社,2008,18-33.

[11] 黄俊.基于WEB的毕业设计双向选题系统[J].电脑知识与技术,2009(4),775.

[12] 单锦辉,姜瑛,孙萍.软件测试研究进展[N].北京大学学报,2005.1.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

展开阅读全文

没有更多推荐了,返回首页