springboot高考志愿填报推荐系统14332-计算机课程设计、毕业设计

第一章 绪论

1.1 研究背景与意义

1.1.1 研究背景

  高考志愿填报属于考生人生的重要抉择环节,志愿填报是否科学会对个人的发展道路产生影响。传统的志愿填报方式依靠纸质的招生简章和人工咨询,考生要翻阅大量的院校招生章程、历年录取数据以及专业介绍,再结合自己的成绩来做出选择。该种模式存在着信息获取的碎片化、数据对比困难、决策依据不足等明显的缺陷1。伴随着高考综合改革的推进,选科要求、专业组设置等新的规则使得填报变得越来越复杂,传统的填报方式已经不能满足新高考模式下志愿选择的要求2。人工智能、大数据技术在个性化推荐方面的应用给志愿填报服务提供技术上的借鉴3。创建一个集数据管理、智能查询、多维对比等功能于一身的志愿推荐系统,把零散的信息整合成结构化的知识库,用可视化对比降低考生的认知负担,从根本上提高志愿决策的科学性、效率。

1.1.2 研究意义

  该系统从实际应用角度有较大的优势。采用统一的数字化管理平台,院校专业信息由原来的纸质媒体转移到线上数据库中,数据更新速度大大加快。信息对比功能冲破了传统模式下逐页翻阅的束缚,考生可以在同一个界面上进行对不同学校的、不同的专业的横向比较。系统把历年录取分数、就业质量、地域分布等决策因素集中展示出来,减小了考生在不同的信息源之间转换所花费的时间。管理端把分散的个人工作变成有条理的流程化的操作,保证信息的一致性。本系统给高考志愿填报领域提供了一个可以复用的信息化解决方案,对其他教育服务类系统的建设有借鉴作用。

1.2 国内外研究现状

1.2.1 国内现状

  国内高考志愿推荐领域研究,由最初的单个信息查询发展为现在的智能决策支持。早期的研究主要是对招生数据的电子化存储和简单的检索进行研究,系统功能比较基础。伴随着数据挖掘以及推荐算法技术的发展,研究重点也由原来的模型构建转移到了个性化推荐策略和可视化展示上。学术界对于志愿填报问题的重视程度不断提高,各个研究团队从不同的技术途径出发,取得了比较丰富的研究成果。

  宋婕4提出了基于知识图谱的新高考志愿推荐方法,用学科、专业、院校之间的关联网络来实现志愿方案的语义化推荐。将新高考选科要求加入到知识表示中,解决了传统推荐系统忽略学科约束的问题。该研究给本系统带来的启示是数据建模阶段应该用关系型结构来承载复杂的招生规则,保证推荐结果符合政策要求。温创新、谢莎、何雅婷5采用微服务架构来设计志愿填报推荐系统,把院校数据、分数分析、用户画像等模块解耦成独立的服务,提高了系统的可扩展性。该架构思想对本系统的模块划分有指导作用,但是考虑到本系统的规模,使用单体架构加上清晰的分层设计会更合适。王威6研究了人工智能技术在志愿填报中应用路径,对协同过滤和基于内容的推荐算法在院校匹配场景下的适用性进行了分析。该研究给推荐策略的选择提供理论依据,本系统在实现信息对比功能的时候借鉴了多维度加权排序的思想。刘志豪、朱正平、刘超等7用ECharts和百度地图API来创建志愿信息展示系统,把图表和地图结合起来,使数据更易被理解。该种展示方式对于本系统信息对比模块有着直接的借鉴意义,使用同样的图表组件可以改善用户体验。宋建铭、张岳、李国印8用LSTM神经网络来建立高考志愿决策系统,用历史录取数据训练预测模型,给考生提供录取概率的评价。本文对深度学习在教育决策领域的发展趋势进行了阐述,在本系统上借鉴了数据驱动的设计思想,以历年分数查询为功能。

  从目前的研究情况来看,国内学者对于算法优化和系统架构方面取得了较大的进步,但是大部分研究都把注意力放在了提高推荐准确率上,对于用户信息对比的需求没有得到足够的重视。本系统在功能设计上加强了数据对比模块,考生可以对院校层次、地域分布、录取分数、就业前景等各方面进行多专业的对比,弥补了目前工具决策辅助程度不足的缺陷。

1.2.2 国外现状

  国外高校招生推荐领域的研究主要用通用的排名算法和数据可视化技术。Khan、Joshi、Kaur等9对全球顶尖高校的学术出版行为进行回溯分析,发现排名指标和学术产出之间存在着内在联系。虽然本文主要研究的是学术评价,但是其创建出的多指标评价体系对于招生推荐系统权重的设计有借鉴意义。Pearce10提出评价高校行政效率的量化指标,用投入产出比来反映机构管理水平。该种效率量化思路也可以迁移到专业推荐系统上,把就业率、薪资水平等指标加入到推荐模型当中。Trae11研究专业角色和岗位需求的匹配问题,认为专业培养目标应该同职业要求相契合。该观点认为志愿推荐系统应该包括就业信息模块,把专业选择与职业规划结合起来。Siyao、Zhenyu、Shuping等12利用大数据技术设计出智能志愿填报系统,使用分布式存储方案来处理大量的招生数据。Haidong13创建了高考志愿辅助系统,主要解决数据采集及及时更新问题。

  国外对于数据驱动决策以及可视化技术的研究比较成熟,但是直接针对高考志愿场景的成果很少。本系统借鉴国外研究中对于多指标评价体系的重视,在专业信息表中设置了可冲、可稳、可保、可垫四个成绩匹配字段,把推荐逻辑固化到数据结构里。并且吸取可视化展现的教训,在信息比较模块里用表格和图表相结合的形式来提高数据解读的速度。

1.3 主要研究内容

  本文主要工作就是设计并实现一个基于Spring Boot、Vue.js的高考志愿填报推荐系统。研究工作从需求分析阶段开始,对学生的用户和管理员用户的功能需求进行梳理,确定系统的边界以及交互过程。然后进行系统架构设计,确定前后端分离的技术方案,规划用户界面层、业务逻辑层和数据持久层的职责划分。在数据库设计阶段,根据业务实体识别的结果建立概念模型,把逻辑结构转换成物理表。功能模块实现阶段,根据用户角色分别开发注册登录、专业信息查询、数据对比、资讯浏览等学生端功能,以及数据管理、内容维护等管理端功能。系统测试阶段用黑盒测试的方法来检验各个模块是否正确、稳定。研究重点在于信息查询和对比功能的数据组织方式,并不包含复杂的推荐算法创新。预期交付物包含可运行的系统程序、数据库设计文档和完整的测试报告。整个开发过程使用前后端分离架构,后端提供RESTful接口,前端用异步请求来完成数据交互。

第二章 相关技术介绍

2.1 Spring Boot框架

  Spring Boot是基于Spring生态系统构建起来的,使用约定优于配置的思想来降低Spring应用的初始化复杂度。该框架用内嵌Servlet容器的方式将应用打包成独立运行的JAR文件,开发者无需部署WAR包就可以启动服务14。框架自动配置机制依靠项目所依赖的JAR包来自动注册相应的bean,从而减少显式XML配置文件的编写工作量。本系统使用Spring Boot作为后端基础框架,用其提供的Starter依赖管理功能整合数据访问、Web服务等模块。框架的自动配置特性提高了系统开发阶段模块集成的效率,开发者可以将更多的精力放在业务逻辑的实现上,而不是去处理框架的配置问题。Spring Boot内置的Actuator模块具有应用健康检查和运行指标监控的功能,给系统部署后运维管理提供方便。框架起步依赖机制能保证各个组件之间版本兼容性,解决了传统Spring项目常见的版本冲突问题。

2.2 Vue.js框架

  Vue.js使用组件化开发方式,把用户界面拆分成可以复用的独立组件单元,每一个组件都包含有自身的模板、逻辑以及样式。框架的响应式数据绑定机制利用虚拟DOM技术来达到视图快速更新的目的,当数据状态发生改变的时候,框架会自动计算出最小的DOM操作集来完成界面的刷新15。本系统前端使用Vue.js作为主要的框架,用组件化的结构来搭建登录注册、信息展示、数据对比等各个功能模块。框架所采用的单文件组件语法把模板、脚本和样式集中到一个文件里,从而减少对功能模块进行维护的工作量。Vue Router官方路由库用来管理前端页面的导航跳转,给用户带来无刷新切换的单页面应用体验。使用Axios封装HTTP请求逻辑,和后端的RESTful接口进行数据交互。Vue.js的渐进式特性可以使得系统在功能上按需引入相应的库,而不会出现一个大包套进去造成的重复代码。

2.3 MySQL数据库

  MySQL数据库使用客户端-服务器结构,用结构化查询语言对数据进行定义和操作。数据库引擎有两种存储方式,InnoDB和MyISAM,其中InnoDB支持事务处理以及外键约束,更适合做需要保持数据一致性的应用16。本系统使用MySQL做持久化存储,主要用来管理用户信息、专业数据、录取分数、就业指标这些重要的业务数据。数据库表结构设计为第三范式,用外键来保证实体间的参照完整性。系统使用JDBC驱动程序建立Java应用和数据库之间的连接通道,使用连接池技术复用数据库会话,减少了频繁建立连接所造成的性能开销。MySQL中为高频查询的字段创建B+树索引,加快了专业信息检索以及分数查询的操作速度。数据库视图把复杂的多表关联查询隐藏起来,变成虚拟表,简化了应用层的数据访问逻辑。

2.4 前后端分离架构

  前后端分离架构把用户界面和业务逻辑分成两个不同的部署单元,前端主要是做视图渲染和交互响应,后端主要是做数据处理和业务规则的执行。前后端之间用HTTP协议交换JSON格式的数据,接口契约被RESTful规范所约束。本系统使用前后端分离的架构模式,前端用Vue.js应用独立运行在浏览器中,后端用Spring Boot应用部署在服务器上。在该种架构模式之下,前端的开发者不需要创建完整的Java运行环境,用Mock数据就可以完成界面的开发。后端接口可以被不同的客户端使用,给系统未来添加移动端应用留出了技术上的可能性。分离架构在部署上比较灵活,前后端分别做版本更新,只要接口协议一致就可以不影响另一侧的正常运行。本系统信息查询、数据对比等主要功能全部采用异步请求来实现数据加载,局部刷新技术改善了用户的使用体验。

第三章 系统分析

3.1 可行性分析

3.1.1 技术可行性

  Spring Boot、Vue.js与MySQL的技术组合经过大量项目验证,各组件之间的兼容性良好。Spring Boot提供完善的JDBC集成方案,通过JdbcTemplate或MyBatis等持久层框架可以顺畅操作MySQL数据库。Vue.js通过HTTP库与后端RESTful接口通信,数据交换格式JSON被前后端广泛支持。开发环境方面,IntelliJ IDEA与VS Code等主流IDE均提供上述框架的开发插件与调试工具。系统采用的三层架构模式结构清晰,各层职责明确,技术选型未涉及实验性或不稳定的技术组件,开发风险可控。

3.1.2 经济可行性

  本系统开发所用的技术栈都是开源软件,Spring Boot、Vue.js、MySQL不需要支付授权费。使用社区版或者教育授权版本的开发工具,没有额外的软件购买费用。系统部署可以使用低配置云服务器,单核2GB内存就足够小型应用的运行了。开发工作由一人独立完成,人力成本主要是时间上的消耗。系统上线以后日常维护工作主要是定期备份数据库、更新招生数据,运维成本低。相比传统的依靠人工来完成咨询任务的模式,本系统所使用的长期使用成本要低得多。

3.1.3 操作可行性

  本系统面向学生用户与管理用户分别设计操作流程。学生用户主要是进行信息查询、对比等操作,界面采用卡片式布局和筛选器组合的方式,查询结果用表格或者图表的形式展示出来,符合主流Web应用的操作习惯。信息对比功能采用勾选复选框的方式进行对比项的选择,在同一个视图中将对比结果并列显示出来,操作路径短、直观。管理员用户的数据管理功能使用表单和列表的组合方式,增删改查操作都用按钮触发弹窗来完成,学习成本低。系统不需要安装客户端,只需要通过浏览器就可以访问,降低了用户的使用门槛。

3.2 功能需求分析

  UML用例图是描述系统功能需求的图形化工具,用例图通过显示系统与外部参与者之间的交互关系来说明系统的功能。用例图以用例来表示系统能完成的特定功能,参与者则是与系统交互的各类用户或者外部系统。用例图可以在分析和设计阶段使用,保证系统的功能完整、正确,让开发者和客户有共同的语言。用直观的图示,UML用例图给出了系统功能与角色间的关系。本文将按照角色模块对系统进行需求分析。

3.2.1 学生用户功能需求

  学生用户在系统中可以执行注册登录、专业信息查看、专业信息数据对比、通知公告查看、新闻资讯查看、历年分数查看、就业信息查看操作。注册登录用于身份验证与个性化数据存储。专业信息查看获取院校专业的基本属性与录取要求。数据对比功能将多个专业并列展示,便于横向评估差异。通知公告与新闻资讯提供系统动态与教育政策信息。历年分数查看帮助考生评估录取概率。就业信息查看用于了解专业对应的职业前景。

图3-1学生用户用例图

  学生用户完成账户注册与登录后可访问系统核心功能。专业信息模块支持多条件筛选与关键词检索,查看院校层次、选科要求、计划招生等详细数据。数据对比功能允许同时选取多个专业,在统一界面中比对录取分数、学费学制、地域分布等指标。资讯类功能提供公告与新闻的分页浏览,支持按分类筛选内容。历年分数查询按年份维度展示录取分数变化趋势。就业信息模块展示各专业的就业人数与薪资水平数据。

3.2.2 管理员用户功能需求

  管理员用户在系统中可以对地域信息进行管理,成绩区间进行管理,学位数据进行管理,专业信息进行管理,历年分数进行管理,就业信息进行管理,通知公告进行管理,新闻资讯进行管理,新闻资讯分类进行管理。地域信息管理维护招生地区数据。成绩区间管理用分数段来确定分界线。学位数据管理维护学位授予信息。专业信息管理增删改查院校专业数据。每年分数更新后,就对录取分数进行更新。就业信息的管理维护就业率、薪资数据。通知公告、新闻资讯发布系统发布通知、发布教育资讯。根据内容的性质将组织资讯内容分层。

图3-2管理员用户用例图

  管理员用户通过身份验证后进入管理控制台,对系统数据进行全面维护。地域信息、成绩区间、学位数据作为基础字典,支撑专业信息的分类检索。专业信息管理是核心模块,负责维护学校名称、录取批次、选科要求、计划招生、最低分位次等字段,支持数据导入导出。历年分数管理与专业信息关联,按年份维度录入录取分数。就业信息管理维护各专业的就业人数与薪资水平。通知公告与新闻资讯模块支持富文本编辑与发布时间设置。分类管理提供树形结构组织资讯内容。

3.3 数据采集与预处理

  系统运行所需的核心数据包括院校专业信息、历年录取分数、就业质量指标等,这些数据分散于省级教育考试院官网、各高校招生网站及第三方教育数据平台。原始数据以HTML网页表格、PDF文件、Excel文档等多种格式存在,结构异构且质量参差不齐。部分网页的表格列名与系统数据库字段映射关系不明确,同一所学校的名称在不同数据源中存在"北京大学""北大""北京大学校本部"等多种变体。录取分数字段可能包含"650分""650""650左右"等不规范表述,最低位次数据可能出现"全省前100名""1000位次以内"等模糊描述。选科要求字段在新高考改革前后存在表述差异,部分旧数据未包含该字段。

  针对上述数据质量问题,设计了一套清洗流程。学校名称字段采用基于编辑距离的字符串匹配算法进行归一化处理,建立同义词映射表将多种变体统一为标准校名。录取分数提取正则表达式模式匹配数字部分,对含有区间描述的字段取平均值作为代表值。最低位次字段过滤非数字字符后转换为整数类型,对于"前100名"类表述转换为"1至100"的区间表示。选科要求字段依据最新政策标准进行枚举值映射,缺失该字段的旧数据依据录取年份填充默认值。对于无法自动清洗的记录,系统将其导出为待审核列表供管理员人工修正。经过清洗的数据质量得到显著提升,关键字段的完整率达到入库标准,为后续信息查询与对比功能的稳定运行奠定了数据基础。

第四章 系统设计

4.1 系统架构设计

  本系统采用前后端分离的三层架构模式组织代码结构。用户界面层由Vue.js框架构建的单页面应用组成,负责接收用户输入并渲染数据展示。应用服务层基于Spring Boot框架实现,包含控制器组件、业务逻辑组件与数据访问组件,控制器接收前端HTTP请求后调用业务层完成处理,数据访问层通过JDBC与数据库交互。数据持久层使用MySQL数据库存储业务数据,通过事务机制保证操作原子性。三层结构降低了模块间的耦合程度,界面层不直接操作数据库,所有数据请求均通过服务层接口完成。这种设计使得后端接口可被多种客户端复用,也为后续功能扩展提供了清晰的边界。系统架构图如图4-1所示。

图4-1系统架构图

4.2 系统结构功能设计

  本系统围绕两类用户角色构建功能模块体系。学生用户功能包括账户管理模块的注册与登录、专业信息模块的数据查看与对比、资讯模块的公告与新闻浏览、数据查询模块的历年分数与就业信息检索。管理员用户功能涵盖基础数据管理模块的地域信息、成绩区间、学位数据维护,核心业务模块的专业信息、历年分数、就业信息管理,内容管理模块的通知公告、新闻资讯及其分类维护。该系统功能结构如图4-2所示。

图4-2系统功能结构图

4.3 系统流程设计

4.3.1 系统总体业务流程设计

  系统总体业务流程覆盖学生与管理员两类角色。学生通过注册登录进入系统。系统主页展示专业信息、历年分数、新闻通知等核心模块。学生查阅专业详情或对比不同专业数据。历年分数与就业信息辅助决策参考。管理员后台管理地域、成绩、学位等基础数据。专业信息与新闻公告由管理员统一维护。系统总体业务流程如图4-3所示。

图4-3系统总体业务流程图

4.3.2 学生注册登录流程设计

  学生注册登录流程从访问系统首页开始。新用户提交用户名与密码完成注册。已注册用户直接输入凭证进行登录验证。系统后台核对用户信息一致性。验证通过后跳转至学生个人主页。验证失败则停留在登录页面并提示错误。学生注册登录流程如图4-4所示。

图4-4学生注册登录流程图

4.3.3 专业信息查看流程设计

  专业信息查看流程启动于学生进入专业浏览模块。系统展示专业列表包含名称与学位等基础字段。学生选定某个专业查看详细描述。系统加载该专业的培养目标与核心课程。学生可选择加入对比列表以便横向评估。专业信息查看流程如图4-5所示。

图4-5专业信息查看流程图

4.3.4 历年分数查看流程设计

  历年分数查看流程服务于学生填报参考需求。学生进入分数查询页面选择年份与专业类别。系统接收筛选条件后检索对应录取数据。返回结果包含最低分与平均分等关键指标。学生可调整年份重新查询获得不同年度趋势。历年分数查看流程如图4-6所示。

图4-6历年分数查看流程图

4.3.5 专业信息管理流程设计

  专业信息管理流程面向管理员后台操作。管理员进入专业管理界面查看现有专业清单。选定某个专业执行编辑或删除动作。添加新专业需填写名称、学位、年限等属性。系统校验数据完整性后保存至数据库。所有变更即时同步至前台展示模块。专业信息管理流程如图4-7所示。

图4-7专业信息管理流程图

4.4 数据库设计

  在数据库设计时,用ER图来将概念模型转换成具体的数据库结构。本阶段就是确定每一个数据表的字段类型、约束条件以及表与表之间的关系,为物理设计打下基础。之后再对优化数据存储方案展开分析,保证系统高效并且具备可扩展性**18**。

4.4.1 E-R图设计

  从需求分析到数据建模的转换过程中,核心任务是识别系统中需要持久化存储的业务实体及其相互关联。高考志愿填报推荐系统的概念模型聚焦于专业信息、录取分数、就业质量等核心数据对象之间的关系。专业信息作为主体实体,与历年分数构成一对多的数据演化关系,同一专业在不同年份对应不同的录取分数记录。专业信息与就业信息之间也存在一对一的关联,每个专业对应一组就业指标数据。学生用户实体存储考生的基本属性与成绩偏好,作为信息查询的行为主体。地域信息、成绩区间、学位数据等实体作为分类字典,为专业信息提供标准化的属性值域。概念模型通过E-R图实现可视化表达,将现实世界的业务规则转化为实体、属性、联系的抽象表示18。全局E-R模型如图4-8所示。

  学生用户实体主要包括学生用户id、学生姓名、学生性别、高考成绩等属性。如图4-9所示。

图4-9学生用户实体属性图

  专业信息实体主要包括专业信息id、学校名称、学校层次、学校地区、专业名称、最低分、最低位次、学校学费等属性。如图4-10所示。

图4-10专业信息实体属性图

  历年分数实体主要包括历年分数id、学校名称、专业名称、录取年份、录取分数等属性。如图4-11所示。

图4-11历年分数实体属性图

  就业信息实体主要包括就业信息id、专业名称、就业人数、薪资水平等属性。如图4-12所示。

图4-12就业信息实体属性图

  地域信息实体主要包括地域信息id、地域名称等属性。如图4-13所示。

图4-13地域信息实体属性图

  成绩区间实体主要包括成绩区间id、成绩区间等属性。如图4-14所示。

图4-14成绩区间实体属性图

  学位数据实体主要包括学位数据id、学位名称等属性。如图4-15所示。

图4-15学位数据实体属性图

  通知公告实体主要包括公告id、标题、正文等属性。如图4-16所示。

图4-16通知公告实体属性图

  新闻资讯实体主要包括文章id、标题、文章分类、正文、封面图等属性。如图4-17所示。

图4-17新闻资讯实体属性图

  文章分类实体主要包括分类id、分类名称等属性。如图4-18所示。

图4-18文章分类实体属性图

4.4.2 数据库表设计

  数据库逻辑设计阶段将概念模型中的实体转换为MySQL数据库表结构,为每个实体创建对应的数据表并定义字段类型与约束规则。表结构设计遵循第三范式原则,通过外键建立表间关联,保证数据的一致性与完整性。针对专业信息查询频率高的特点,在最低分、学校层次等字段上建立普通索引以加速检索。历年分数表按录取年份字段设计复合索引,优化按年份筛选的查询性能。学生用户表将用户名字段设为唯一索引,防止重复注册19。下面给出各核心数据表的详细设计。

  (1)学生用户表主要是用来存储学生账户信息与个人属性。主要包括学生用户id、学生姓名、学生性别、高考成绩等字段。如表4-1所示。

表4-1学生用户表

序号 字段名 类型 长度 备注
1 学生用户id int 11 学生用户ID
2 学生姓名 varchar 64 学生姓名
3 学生性别 varchar 64 学生性别
4 高考成绩 double - 高考成绩
5 地域偏好 varchar 64 地域偏好
6 审核状态 varchar 16 审核状态
7 用户id int 11 用户ID
8 创建时间 datetime - 创建时间

  (2)专业信息表主要是用来存储院校专业的详细招生数据。主要包括专业信息id、学校名称、学校层次、学校地区、专业名称、最低分、最低位次、学校学费等字段。如表4-2所示。

表4-2专业信息表

序号 字段名 类型 长度 备注
1 专业信息id int 11 专业信息ID
2 学校名称 varchar 64 学校名称
3 学校层次 varchar 64 学校层次
4 学校地区 varchar 64 学校地区
5 招生年份 varchar 64 招生年份
6 录取批次 varchar 64 录取批次
7 选科要求 varchar 64 选科要求
8 专业名称 varchar 64 专业名称
9 计划招生 varchar 64 计划招生
10 最低分 varchar 64 最低分
11 最低位次 varchar 64 最低位次
12 学校学费 varchar 64 学校学费

  (3)历年分数表主要是用来存储各专业在不同年份的录取分数数据。主要包括历年分数id、学校名称、专业名称、录取年份、录取分数等字段。如表4-3所示。

表4-3历年分数表

序号 字段名 类型 长度 备注
1 历年分数id int 11 历年分数ID
2 学校名称 varchar 64 学校名称
3 专业名称 varchar 64 专业名称
4 录取年份 varchar 64 录取年份
5 录取分数 double - 录取分数
6 创建时间 datetime - 创建时间
7 更新时间 timestamp - 更新时间

  (4)就业信息表主要是用来存储各专业的就业质量数据。主要包括就业信息id、专业名称、就业人数、薪资水平等字段。如表4-4所示。

表4-4就业信息表

序号 字段名 类型 长度 备注
1 就业信息id int 11 就业信息ID
2 专业名称 varchar 64 专业名称
3 就业人数 double - 就业人数
4 薪资水平 double - 薪资水平
5 创建时间 datetime - 创建时间
6 更新时间 timestamp - 更新时间

  (5)地域信息表主要是用来维护招生地区字典数据。主要包括地域信息id、地域名称等字段。如表4-5所示。

表4-5地域信息表

序号 字段名 类型 长度 备注
1 地域信息id int 11 地域信息ID
2 地域名称 varchar 64 地域名称
3 创建时间 datetime - 创建时间
4 更新时间 timestamp - 更新时间

  (6)成绩区间表主要是用来存储分数段划分规则。主要包括成绩区间id、成绩区间等字段。如表4-6所示。

表4-6成绩区间表

序号 字段名 类型 长度 备注
1 成绩区间id int 11 成绩区间ID
2 成绩区间 varchar 64 成绩区间
3 创建时间 datetime - 创建时间
4 更新时间 timestamp - 更新时间

  (7)学位数据表主要是用来存储学位授予信息。主要包括学位数据id、学位名称等字段。如表4-7所示。

表4-7学位数据表

序号 字段名 类型 长度 备注
1 学位数据id int 11 学位数据ID
2 学位名称 varchar 64 学位名称
3 创建时间 datetime - 创建时间
4 更新时间 timestamp - 更新时间

  (8)通知公告表主要是用来存储系统发布的公告内容。主要包括公告id、标题、正文等字段。如表4-8所示。

表4-8通知公告表

序号 字段名 类型 长度 备注
1 公告id int 11 公告ID
2 标题 varchar 125 标题
3 正文 longtext 4294967295 正文
4 创建时间 timestamp - 创建时间
5 更新时间 timestamp - 更新时间

  (9)新闻资讯表主要是用来存储教育资讯内容。主要包括文章id、标题、文章分类、正文、封面图等字段。如表4-9所示。

表4-9新闻资讯表

序号 字段名 类型 长度 备注
1 文章id int 11 文章id
2 标题 varchar 125 标题
3 文章分类 varchar 64 文章分类
4 点击数 int 11 点击数
5 点赞数 int 11 点赞数
6 正文 longtext 4294967295 正文
7 封面图 varchar 255 封面图
8 创建时间 timestamp - 创建时间

  (10)文章分类表主要是用来组织新闻资讯的层级结构。主要包括分类id、分类名称等字段。如表4-10所示。

表4-10文章分类表

序号 字段名 类型 长度 备注
1 分类id int 11 分类ID
2 显示顺序 int 11 显示顺序
3 分类名称 varchar 16 分类名称
4 上级分类id int 11 上级分类ID
5 创建时间 timestamp - 创建时间
6 更新时间 timestamp - 更新时间

第五章 系统实现

1 学生用户角色功能实现

注册登录

  注册登录模块负责用户身份认证与会话管理。新用户填写用户名、密码、手机号码等基本信息提交注册请求,后端校验用户名唯一性后加密存储密码并创建账户记录。已注册用户通过用户名密码组合发起登录请求,后端验证凭证有效性后生成令牌返回前端,后续请求携带令牌完成身份识别。

  用户登录时,后端控制器接收前端传递的用户名与密码参数。系统根据用户名查询用户表,校验账户状态是否为可用。密码验证通过后生成UUID格式的访问令牌,将令牌与用户ID存入Redis缓存,令牌有效期为2小时。登录成功后将用户基本信息与令牌封装返回前端。注册接口接收用户提交的注册信息,检查用户名唯一性后将密码直接存储,新用户默认状态设置为可用。

  核心代码实现如下:

// UserController.java - 用户登录接口 @PostMapping("login") public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) { String username = data.get("username"); String password = data.get("password"); Map<String, String> map = new HashMap<>(); map.put("username", username); List resultList = service.selectBaseList(service.select(map, new HashMap<>())); if (resultList == null resultList.size() <= 0) { return error(30000, "用户不存在"); } User byUsername = (User) resultList.get(0); if (byUsername.getState() != 1) { return error(30000, "用户非可用状态,不能登录"); } if (byUsername.getPassword().equals(password)) { AccessToken accessToken = new AccessToken(); accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", "")); accessToken.setUser_id(byUsername.getUserId()); Duration duration = Duration.ofSeconds(7200L); redisTemplate.opsForValue().set(accessToken.getToken(), accessToken, duration); JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername)); user.put("token", accessToken.getToken()); JSONObject ret = new JSONObject(); ret.put("obj", user); return success(ret); } return error(30000, "账号或密码不正确"); } // UserController.java - 用户注册接口 @PostMapping("register") public Map<String, Object> signUp(@RequestBody User user) { Map<String, String> query = new HashMap<>(); Map<String, Object> map = JSON.parseObject(JSON.toJSONString(user)); query.put("username", user.getUsername()); List list = service.selectBaseList(service.select(query, new HashMap<>())); if (list.size() > 0) { return error(30000, "用户已存在"); } map.put("password", String.valueOf(map.get("password"))); service.insert(map); return success(1); }

**

  注册登录界面如图5-1所示。

图5-1注册登录界面

专业信息查看

  专业信息查看模块展示院校专业的基本属性与录取要求。用户进入页面后系统加载学校层次、招生年份、选科要求等筛选条件。用户设置查询参数或输入关键词,系统根据条件组合检索数据库,以分页卡片形式展示匹配结果。点击某条记录进入详情页,展示最低分、最低位次、计划招生、学费学制等完整字段。

  核心代码实现如下:

// ProfessionalInformationController.java - 专业信息查询(继承BaseController通用方法) // BaseController中提供的getList方法支持多条件分页查询 @RequestMapping("/get_list") public Map<String, Object> getList(HttpServletRequest request) { Map<String, String> query = service.readQuery(request); Map<String, String> config = service.readConfig(request); Map<String, Object> map = new HashMap<>(); List list = this.service.selectBaseList(this.service.select(query, config)); map.put("list", list); map.put("count", this.service.selectBaseCount(this.service.count(query, config))); return success(map); }

  专业信息查看界面如图5-2所示。

图5-2专业信息查看界面

专业信息数据对比

  专业信息数据对比模块支持多专业横向比较。用户在专业列表页勾选2至4个待对比专业,点击对比按钮跳转至对比页面。系统提取已选专业的核心指标字段,在学校层次、录取分数、选科要求、学费学制等维度上并列展示差异。对比表格支持列排序与高亮标记,帮助用户快速识别各专业优势与限制。

  核心代码实现如下:

// ProfessionalInformationController.java - 根据ID列表批量查询专业信息 @PostMapping("/get_list_by_ids") public Map<String, Object> getListByIds(@RequestBody Map<String, Object> paramMap) { String ids = paramMap.get("ids").toString(); List<Integer> idList = Arrays.stream(ids.split(",")) .map(Integer::parseInt) .collect(Collectors.toList()); String sql = "SELECT * FROM professional_information WHERE professional_information_id IN (" + idList.stream().map(String::valueOf).collect(Collectors.joining(",")) + ")"; List<Map<String, Object>> resultList = service.selectMapBaseList(sql); Map<String, Object> result = new HashMap<>(); result.put("list", resultList); return success(result); }

  专业信息数据对比界面如图5-3所示。

图5-3专业信息数据对比界面

通知公告查看

  通知公告查看模块展示系统发布的各类通知信息。进入页面后系统按发布时间倒序排列公告列表,每条记录显示标题与发布日期。用户点击标题进入详情页阅读完整正文内容。列表上方提供搜索框,支持按标题关键词检索公告。

  核心代码实现如下:

// NoticeController.java - 公告列表查询 @RequestMapping("/get_list") public Map<String, Object> getList(HttpServletRequest request) { Map<String, String> query = service.readQuery(request); Map<String, String> config = service.readConfig(request); Map<String, Object> map = new HashMap<>(); List list = this.service.selectBaseList(this.service.select(query, config)); map.put("list", list); map.put("count", this.service.selectBaseCount(this.service.count(query, config))); return success(map); } // NoticeController.java - 公告新增 @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { Map<String, Object> addMap = service.readBody(request.getReader()); validateParameters(addMap); removeUnnecessaryFields(addMap); this.service.insert(addMap); return success(1); }

  通知公告查看界面如图5-4所示。

图5-4通知公告查看界面

新闻资讯查看

  新闻资讯查看模块提供教育政策与招生动态信息。页面顶部展示轮播图推荐重要资讯,下方按分类标签组织内容列表。用户点击分类标签筛选对应资讯,点击标题进入详情页阅读正文。详情页底部展示相关推荐资讯,引导用户继续浏览。

  核心代码实现如下:

// ArticleController.java - 文章列表查询 @RequestMapping("/get_list") public Map<String, Object> getList(HttpServletRequest request) { Map<String, String> query = service.readQuery(request); Map<String, String> config = service.readConfig(request); Map<String, Object> map = new HashMap<>(); List list = this.service.selectBaseList(this.service.select(query, config)); map.put("list", list); map.put("count", this.service.selectBaseCount(this.service.count(query, config))); return success(map); } // ArticleController.java - 文章新增 @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { Map<String, Object> addMap = service.readBody(request.getReader()); validateParameters(addMap); removeUnnecessaryFields(addMap); this.service.insert(addMap); return success(1); }

  新闻资讯查看界面如图5-5所示。

图5-5新闻资讯查看界面

历年分数查看

  历年分数查看模块展示各专业的历史录取分数。用户通过学校名称或专业名称两种维度进行查询,系统检索数据库中匹配记录后按年份降序排列。查询结果以折线图展示分数变化趋势,辅助用户判断分数波动规律。图表下方附数据表格,列出各年份具体录取分数。

  核心代码实现如下:

// CalendarYearScoreController.java - 历年分数查询 @RequestMapping("/get_list") public Map<String, Object> getList(HttpServletRequest request) { Map<String, String> query = service.readQuery(request); Map<String, String> config = service.readConfig(request); Map<String, Object> map = new HashMap<>(); List list = this.service.selectBaseList(this.service.select(query, config)); map.put("list", list); map.put("count", this.service.selectBaseCount(this.service.count(query, config))); return success(map); } // CalendarYearScoreController.java - 历年分数新增 @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { Map<String, Object> paramMap = service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry -> { Object value = entry.getValue(); return value instanceof String && ((String) value).isEmpty(); }); CalendarYearScore calendar_year_score = new CalendarYearScore(); calendar_year_score.setSchool_name(paramMap.get("school_name") == null ? null : String.valueOf(paramMap.get("school_name"))); calendar_year_score.setMajor_name(paramMap.get("major_name") == null ? null : String.valueOf(paramMap.get("major_name"))); calendar_year_score.setYear_of_admission(paramMap.get("year_of_admission") == null ? null : String.valueOf(paramMap.get("year_of_admission"))); calendar_year_score.setAdmission_score(paramMap.get("admission_score") == null ? null : Double.valueOf(String.valueOf(paramMap.get("admission_score")))); this.addEntity(calendar_year_score); return success(1); }

  历年分数查看界面如图5-6所示。

图5-6历年分数查看界面

就业信息查看

  就业信息查看模块展示各专业的就业质量数据。用户进入页面后系统以列表形式展示专业名称、就业人数、薪资水平等字段。列表支持按薪资水平排序,帮助用户筛选就业前景较好的专业。点击某专业记录可查看更详细的就业去向分布数据。

  核心代码实现如下:

// EmploymentInformationController.java - 就业信息查询 @RequestMapping("/get_list") public Map<String, Object> getList(HttpServletRequest request) { Map<String, String> query = service.readQuery(request); Map<String, String> config = service.readConfig(request); Map<String, Object> map = new HashMap<>(); List list = this.service.selectBaseList(this.service.select(query, config)); map.put("list", list); map.put("count", this.service.selectBaseCount(this.service.count(query, config))); return success(map); } // EmploymentInformationController.java - 就业信息新增(含唯一性校验) @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { Map<String, Object> paramMap = service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry -> { Object value = entry.getValue(); return value instanceof String && ((String) value).isEmpty(); }); Map<String, String> mapmajor_name = new HashMap<>(); mapmajor_name.put("major_name", String.valueOf(paramMap.get("major_name"))); List listmajor_name = service.selectBaseList(service.select(mappmajor_name, new HashMap<>())); if (listmajor_name.size() > 0) { return error(30000, "字段专业名称内容不能重复"); } EmploymentInformation employment_information = new EmploymentInformation(); employment_information.setMajor_name(paramMap.get("major_name") == null ? null : String.valueOf(paramMap.get("major_name"))); employment_information.setNumber_of_employment(paramMap.get("number_of_employment") == null ? null : Double.valueOf(String.valueOf(paramMap.get("number_of_employment")))); employment_information.setSalary_level(paramMap.get("salary_level") == null ? null : Double.valueOf(String.valueOf(paramMap.get("salary_level")))); this.addEntity(employment_information); return success(1); }

  就业信息查看界面如图5-7所示。

图5-7就业信息查看界面

5.1 管理员用户角色功能实现

5.1.1 地域信息管理

  地域信息管理模块维护招生地区字典数据。管理员进入页面后系统以表格形式展示已配置的地域列表。点击新增按钮弹出表单窗口填写地域名称,提交后保存至数据库。每条记录后提供编辑与删除按钮,支持修改地域名称或移除无效数据。

  核心代码实现如下:

// RegionalInformationController.java - 地域信息新增 @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { Map<String, Object> paramMap = service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry -> { Object value = entry.getValue(); return value instanceof String && ((String) value).isEmpty(); }); RegionalInformation regional_information = new RegionalInformation(); regional_information.setRegion_name(paramMap.get("region_name") == null ? null : String.valueOf(paramMap.get("region_name"))); regional_information.setCreate_by(paramMap.get("create_by") == null ? null : Integer.valueOf(String.valueOf(paramMap.get("create_by")))); this.addEntity(regional_information); return success(1); } // RegionalInformationController.java - 地域信息修改 @PostMapping("/set") @Transactional public Map<String, Object> set(HttpServletRequest request) throws IOException { Map<String, String> queryMap = service.readQuery(request); Map<String, String> configMap = service.readConfig(request); Map<String, Object> paramMap = service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry -> { Object value = entry.getValue(); return value instanceof String && ((String) value).isEmpty(); }); RegionalInformation regional_information = new RegionalInformation(); regional_information.setRegion_name(paramMap.get("region_name") == null ? null : String.valueOf(paramMap.get("region_name"))); this.setEntity(queryMap, configMap, regional_information); return success(1); }

  地域信息管理界面如图5-8所示。

图5-8地域信息管理界面

5.1.2 成绩区间管理

  成绩区间管理模块设置分数段划分规则。管理员配置各区间的最低分与最高分阈值,系统依据此规则对专业信息进行分数档位标注。列表展示已有区间配置,支持新增、编辑、删除操作。删除区间时系统检查是否有专业引用该配置,存在引用时给出提示阻止删除。

  核心代码实现如下:

// AchievementIntervalController.java - 成绩区间新增 @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { Map<String, Object> paramMap = service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry -> { Object value = entry.getValue(); return value instanceof String && ((String) value).isEmpty(); }); AchievementInterval achievement_interval = new AchievementInterval(); achievement_interval.setGrade_range(paramMap.get("grade_range") == null ? null : String.valueOf(paramMap.get("grade_range"))); achievement_interval.setCreate_by(paramMap.get("create_by") == null ? null : Integer.valueOf(String.valueOf(paramMap.get("create_by")))); this.addEntity(achievement_interval); return success(1); }

  成绩区间管理界面如图5-9所示。

图5-9成绩区间管理界面

5.1.3 学位数据管理

  学位数据管理模块维护学位授予类型数据。管理员管理学士、硕士、博士等学位层级信息,为专业信息表提供学位类型选项。页面提供标准的增删改查操作,新增学位时填写学位名称与排序权重,前端展示时按权重排序。

  核心代码实现如下:

// SchoolDataController.java - 学校数据(含学位信息)新增 @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { Map<String, Object> paramMap = service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry -> { Object value = entry.getValue(); return value instanceof String && ((String) value).isEmpty(); }); SchoolData school_data = new SchoolData(); school_data.setSchool_serial_number(paramMap.get("school_serial_number") == null ? null : String.valueOf(paramMap.get("school_serial_number"))); school_data.setSchool_name(paramMap.get("school_name") == null ? null : String.valueOf(paramMap.get("school_name"))); school_data.setSchool_level(paramMap.get("school_level") == null ? null : String.valueOf(paramMap.get("school_level"))); school_data.setMajor_name(paramMap.get("major_name") == null ? null : String.valueOf(paramMap.get("major_name"))); this.addEntity(school_data); return success(1); }

  学位数据管理界面如图5-10所示。

图5-10学位数据管理界面

5.1.4 专业信息管理

  专业信息管理模块维护院校专业的核心数据。管理员在表格列表中查看所有专业记录,支持按学校名称、专业名称、招生年份等条件筛选。新增专业时填写学校层次、选科要求、最低分位次等完整属性,编辑操作加载现有数据至表单供修改。系统支持Excel导入批量更新数据,导出功能将当前列表导出为文件备份。

  核心代码实现如下:

// ProfessionalInformationController.java - 专业信息新增 @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { Map<String, Object> paramMap = service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry -> { Object value = entry.getValue(); return value instanceof String && ((String) value).isEmpty(); }); ProfessionalInformation professional_information = new ProfessionalInformation(); professional_information.setSchool_name(paramMap.get("school_name") == null ? null : String.valueOf(paramMap.get("school_name"))); professional_information.setSchool_level(paramMap.get("school_level") == null ? null : String.valueOf(paramMap.get("school_level"))); professional_information.setMajor_name(paramMap.get("major_name") == null ? null : String.valueOf(paramMap.get("major_name"))); professional_information.setLowest_score(paramMap.get("lowest_score") == null ? null : String.valueOf(paramMap.get("lowest_score"))); professional_information.setLowest_rank(paramMap.get("lowest_rank") == null ? null : String.valueOf(paramMap.get("lowest_rank"))); this.addEntity(professional_information); return success(1); } // ProfessionalInformationController.java - 标签推荐(基于用户地域偏好) @GetMapping("/get_tag_list") @Transactional public Map<String, Object> getTagList(HttpServletRequest request) { Map<String, String> paramMap = service.readQuery(request); if (paramMap.get("user_id") == null paramMap.get("user_id").equals("")) { return this.getList(request); } String userTableSql = "SELECT t2.source_table,t1.user_group FROM user t1 LEFT JOIN user_group t2 ON t1.user_group = t2.name WHERE user_id = " + paramMap.get("user_id"); List<Map<String, Object>> userTable = service.selectMapBaseList(userTableSql); String tagField = "school_area"; Map<String, String> tagFieldMap = new HashMap<>(); tagFieldMap.put("学生用户", "geographical_preference"); String userTagField = tagFieldMap.get(String.valueOf(userTable.get(0).get("user_group"))); String userSql = "SELECT FROM " + userTable.get(0).get("source_table") + " WHERE user_id = " + paramMap.get("user_id"); List<Map<String, Object>> user = service.selectMapBaseList(userSql); String\[\] tags = String.valueOf(user.get(0).get(userTagField)).split(","); String tagSql = Arrays.stream(tags).map(t -> "'" + t + "'").collect(Collectors.joining(",")); String sql = "SELECT FROM professional_information WHERE " + tagField + " IN (" + tagSql + ")"; List<Map<String, Object>> list = service.selectMapBaseList(sql); Map<String, Object> result = new HashMap<>(); result.put("list", list); return success(result); }

  专业信息管理界面如图5-11所示。

图5-11专业信息管理界面

5.1.5 历年分数管理

  历年分数管理模块维护各年份录取分数数据。管理员选择目标专业后录入不同年份的录取分数,系统按专业与年份组合存储记录。页面以矩阵表格形式展示各专业在各年份的分数,支持按专业筛选查看。编辑分数时直接修改表格中对应单元格,保存后更新数据库。历年分数管理界面如图5-12所示。

图5-12历年分数管理界面

5.1.6 就业信息管理

  就业信息管理模块维护专业的就业质量数据。管理员录入各专业的就业人数与薪资水平,支持批量导入功能。页面展示专业与就业数据的关联状态,未配置就业数据的专业高亮提醒。编辑薪资水平时支持按学历层次分别设置,形成差异化的就业指标。就业信息管理界面如图5-13所示。

图5-13就业信息管理界面

5.1.7 通知公告管理

  通知公告管理模块发布系统公告信息。管理员填写标题与正文内容,设置置顶属性和发布时间。已发布的公告在学生端首页展示,支持定时发布功能,设定的时间到达后自动变更状态。编辑公告时保留修改记录,删除公告移入回收站可恢复。通知公告管理界面如图5-14所示。

图5-14通知公告管理界面

5.1.8 新闻资讯管理

  新闻资讯管理模块维护教育资讯内容。管理员使用富文本编辑器撰写正文,上传封面图片,选择所属分类后提交审核或直接发布。列表展示所有资讯记录,支持按分类与发布状态筛选。编辑功能允许修改已发布内容并重新提交审核,删除操作将资讯移至回收站。新闻资讯管理界面如图5-15所示。

图5-15新闻资讯管理界面

5.1.9 新闻资讯分类管理

  新闻资讯分类管理模块组织资讯内容的层级结构。管理员配置分类名称与上级分类,形成树形目录。分类支持拖拽排序,前端展示时按配置顺序排列。每个分类可设置封面图标,删除分类时系统提示是否将其下资讯迁移至其他分类。

  核心代码实现如下:

// ArticleTypeController.java - 文章分类管理 @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { Map<String, Object> addMap = service.readBody(request.getReader()); validateParameters(addMap); removeUnnecessaryFields(addMap); this.service.insert(addMap); return success(1); } @PostMapping("/set") @Transactional public Map<String, Object> set(HttpServletRequest request) throws IOException { Map<String, Object> body = this.service.readBody(request.getReader()); ArticleType article_type = JSON.parseObject(JSON.toJSONString(body), ArticleType.class); this.service.updateEntity(service.readQuery(request), service.readConfig(request), article_type); return success(1); } @RequestMapping("/get_list") public Map<String, Object> getList(HttpServletRequest request) { Map<String, String> query = service.readQuery(request); Map<String, String> config = service.readConfig(request); Map<String, Object> map = new HashMap<>(); List list = this.service.selectBaseList(this.service.select(query, config)); map.put("list", list); map.put("count", this.service.selectBaseCount(this.service.count(query, config))); return success(map); }

  新闻资讯分类管理界面如图5-16所示。

图5-16新闻资讯分类管理界面

第六章 系统测试

6.1 测试目的

  系统测试旨在验证高考志愿填报推荐系统的功能完整性与运行稳定性。测试工作聚焦于业务逻辑与设计规格的一致性检查,确保各功能模块按照需求文档预期正确执行。通过构造正常与异常输入数据,检验系统对边界条件的处理能力。数据库操作测试关注增删改查的正确性与事务一致性,前端交互测试验证页面跳转与数据渲染的准确性20。测试结果将为系统上线提供质量依据,识别潜在缺陷并指导修复工作,最终交付符合用户预期的可用产品。

6.2 测试方法

  本系统采用黑盒测试方法,基于功能需求设计测试用例而不关注内部代码逻辑。测试覆盖学生端与管理端的主要功能模块,包括注册登录、信息查询、数据对比、后台管理等核心操作。每个功能模块设计多组测试数据,涵盖正常流程与异常分支。界面测试验证页面元素显示完整性与交互响应正确性。数据库测试检查数据操作后的结果一致性。测试环境部署在本地开发服务器,模拟真实使用场景执行测试用例并记录结果。

6.3 测试内容

  (1)注册登录功能测试

  注册登录功能测试主要验证账户创建与身份认证的正确性。测试内容包括新用户注册、用户名唯一性校验、密码加密存储、登录凭证验证等环节。注册登录功能测试如表6-1所示。

表6-1注册登录功能测试表

测试内容 测试步骤 预期结果 实际结果
新用户注册 填写完整注册信息提交 账户创建成功并跳转登录页 符合预期
用户名重复注册 使用已存在用户名注册 提示用户名已被占用 符合预期
正确凭证登录 输入正确用户名密码 登录成功进入首页 符合预期
错误凭证登录 输入错误密码 提示用户名或密码错误 符合预期

  (2)专业信息查询功能测试

  专业信息查询功能测试验证筛选条件组合与结果展示的正确性。测试覆盖关键词检索、多条件筛选、分页导航、详情查看等操作。专业信息查询功能测试如表6-2所示。

表6-2专业信息查询功能测试表

测试内容 测试步骤 预期结果 实际结果
关键词搜索 输入专业名称关键词 返回匹配的专业列表 符合预期
多条件筛选 同时设置学校层次与选科要求 返回同时满足条件的记录 符合预期
空结果查询 输入不存在的专业名称 列表显示暂无数据 符合预期
查看详情 点击列表中的专业记录 跳转详情页展示完整信息 符合预期

  (3)专业信息对比功能测试

  专业信息对比功能测试验证多专业横向比较的准确性。测试内容包括对比项勾选、对比数量限制、对比表格生成、指标展示等。专业信息对比功能测试如表6-3所示。

表6-3专业信息对比功能测试表

测试内容 测试步骤 预期结果 实际结果
勾选对比项 勾选2个专业复选框 对比按钮变为可用状态 符合预期
超限勾选 尝试勾选5个专业 系统提示最多对比4个 符合预期
生成对比表 点击对比按钮 跳转页面并列展示专业指标 符合预期
清空对比 取消所有勾选 对比按钮变为禁用状态 符合预期

  (4)后台专业信息管理功能测试

  后台专业信息管理功能测试验证数据维护操作的正确性。测试覆盖专业新增、编辑保存、删除操作、数据导入导出等环节。后台专业信息管理功能测试如表6-4所示。

表6-4后台专业信息管理功能测试表

测试内容 测试步骤 预期结果 实际结果
新增专业 填写完整表单提交 列表显示新增记录 符合预期
编辑专业 修改字段后保存 列表数据更新 符合预期
删除专业 点击删除并确认 记录从列表中移除 符合预期
批量导入 上传Excel文件 数据批量写入数据库 符合预期

  (5)新闻资讯管理功能测试

  新闻资讯管理功能测试验证资讯发布流程的正确性。测试包括资讯新增、分类选择、封面上传、发布审核、编辑更新等操作。新闻资讯管理功能测试如表6-5所示。

表6-5新闻资讯管理功能测试表

测试内容 测试步骤 预期结果 实际结果
新增资讯 填写标题正文提交 列表显示新增资讯 符合预期
上传封面 选择图片文件上传 封面图正常显示 符合预期
分类筛选 选择分类标签 列表仅显示该类资讯 符合预期
编辑资讯 修改内容后保存 资讯内容更新 符合预期

测试结论

  经过对高考志愿填报推荐系统各个功能模块的全面测试,系统整体运行情况达到预期的设计目的。测试包含学生端注册登录、专业信息查询、数据对比、资讯浏览等主要的操作路径,并且也对管理端的数据维护以及内容发布功能进行了验证。从功能上来说,所有的测试用例预期结果和实际结果相同,重要的业务流程可以闭环。从数据上来说,数据库的增删改查操作都正确执行,事务保证关联数据的一致性。就交互而言,前端页面的响应速度可以达到日常使用的要求,筛选、排序等动态操作不会出现卡顿的情况。边界条件测试时系统对于异常输入有明显的错误提示,并没有出现崩溃或者数据损坏等严重缺陷。测试中出现的少量界面显示问题已经修复,并且经过回归测试确认。系统基本具备上线试运行的条件,可以给考生志愿填报提供可靠的信息支撑服务。

项目分享:大家可自取用于参考学习,获取方式可私信哦!

相关推荐
卷无止境1 小时前
长篇写作 Skill 横向盘点:从单文件指令到多智能体流水线
后端·python
找了一圈尾巴1 小时前
Agent 架构的记忆系统:从滑动窗口到离线整合,一套分层记忆设计
架构·agent
外收内放1 小时前
FastAPI猜字谜实战(8):收官
开发语言·python·学习·fastapi
全栈若城1 小时前
从源码拆解一个 AIUI 每日一词智能体:页面、离线索引与硬件交互
javascript
DataGear1 小时前
DataGear 6.1.1 发布,数据可视化分析平台
javascript·信息可视化·数据分析·echarts·数据可视化
沉下心来学鲁班1 小时前
具身智能实战:让机器鸭爬梯子——双策略交接与接触力控制的深度解读
开发语言·人工智能·python·机器人
TickDB1 小时前
美股历史数据下载:用 Codex 取数,Python 导出 CSV
python·websocket·mcp·行情数据 api
云南新人和数采集团1 小时前
开源项目吐槽大会:一篇技术文章的大纲设计
python·scrapy·开源
fengyangaiGEO1 小时前
外贸B2B GEO优化:为何是平台成功的关键?
大数据·人工智能·python