正在做毕设的你🧑💻,是不是也在为这些问题头疼:
> ❓选题不知道选什么方向?
> ❓技术栈不知道怎么搭配?
> ❓代码写了一半发现架构有问题?🤯
> 🚀 本系列文章将带你从零到一完成一个完整的毕设项目,涵盖需求分析
> 🏗️系统设计、💻代码实现、📝论文撰写全流程。
⭐⭐⭐关注我,不迷路,持续更新中~⭐
基于Node.js的马拉松赛事管理系统
摘要
目前马拉松赛事管理大多依靠人工加上零散的电子表格,存在报名数据处理效率不高、物资库存缺少实时跟踪、多角色信息同步延迟等难题。创建基于Node.js的赛事管理系统,对提高赛事组织效率和透明度有实际意义。系统用Node.js作为运行环境,Spring Boot作为后端框架,前端使用Vue,数据库用MySQL,目的是实现赛事信息、报名、成绩、评价和物资库存的闭环管理。参赛者完成注册之后在系统内进行报名以及缴费,赛事与物料的管理由系统管理员和分系统负责人分级控制解决数据孤岛问题。
系统的主实现采用RESTful的API结构,用Spring Boot进行路由以及业务逻辑的处理,并使用JWT做接口的认证,把数据保存到MySQL中。主要功能包含赛事信息的管理、报名的审核、成绩的发布、物资的库存查询以及公告新闻等。参赛用户自主报名、查看成绩和通知;组委用户管理物资的出入库、报名名单;管理员统筹所有的基础数据和权限。经过实际运用可以发现,系统的使用使得人工对账的环节被大大削减,物资流转记录可以被追溯,整个赛事的流程响应速度小于2秒,给中小赛事组织带来可以重复利用的轻量级管理方案。
**关键词:**马拉松赛事管理;Node.js;Spring Boot;Vue;MySQL
ABSTRACT
At present, the management of marathon events is still in an offline form; therefore, the processing of registration data is slow, material inventory cannot be tracked in real time, and there is no timely sharing of information among all parties. Node.js will be used to develop the race management system, and it will improve the efficiency and fairness of the event. Node.js is selected as the runtime environment for the system, and Spring Boot is used for the backend framework and Vue for the front-end; MySQL will serve as the database to achieve full-cycle management of event information, registration, results, reviews, material inventory, etc. Registered participants can register and pay online; organisers and administrators at all levels will be able to manage the workflow of events and materials to solve the data silo problem.
The Basic Design of the Web Service is RESTful. Spring Boot will be used to build the back-end route and business logic, JWT will handle the interface authentication, and event types, material in-and-out records, etc., will be stored in MySQL. The five main functions are event management, registration review, result publishing, material inventory tracking and announcement/news. Self-registration and Viewing of Results and Notifications. Organisers manage the in-and-out of materials and registration lists. Manages Master Data and Permissions. The number of manual reconciliation steps in the system has been reduced in practice; however, the material flow records can still be traced, and the response time for full-process operation is less than two seconds, so it is a light management solution that can be reused by small and medium-sized race organizations.
**Key words:**Marathon Event Management;Node.js;Spring Boot; Vue;MySQL
第1章 绪论
论文的研究背景
伴随着全民健身战略的不断深入以及路跑文化的普及,中国的马拉松赛事数量和参加人数越来越多,赛事组织的复杂程度和管理难度也越来越大。传统的管理模式主要依靠人工的处理以及纸质的记录,组委人员用电子表格来管理报名的信息、手工录入成绩、人工统计物资的库存,造成报名审核时间久、成绩公布迟、物资的调配缺少了及时的数据支持。参加人数达到几千人甚至上万人的时候,人工核对报名信息和缴费记录的错误率就会上升,由于参赛者信息变更、退赛退费等异常流程处理不及时等原因造成用户投诉以及信任危机的发生。物资管理环节由于出入库记录不及时、库存盘点依靠人工等造成短缺或者积压,直接对参赛包发放效率和赛事当天物资保障能力造成影响1。除此之外,多角色之间的信息传递依靠微信群、邮件等非结构化的途径,组委与志愿者之间任务的协同缺少一个统一的视图,造成赛事的公告、成绩发布等重要信息不能被及时、准确地传达出去。同时互联网技术以及Web应用在各个行业管理方面的应用日趋成熟,轻量化、高并发、易部署的在线管理系统已经成为提高组织效率的重要工具。体育赛事管理逐渐由原来的单个管理人员手工操作或者分批操作方式,转而采用一种基于数据驱动的一体化在线平台管理模式,对报名审核、成绩发布、物资调配等各个部分进行管理。但是现有的通用型赛事管理系统大多是为了大型的职业赛事或者综合性运动会而设计的,存在功能重复、权限模型繁杂、部署运维费用昂贵等问题,并且大多忽略了小型赛事对于物料追踪、多人轻量协作、移动端快速响应的实际要求2系统是用PHP或者Java这种重型的开发框架来构建的,对于服务器环境的要求比较高,二次开发以及功能扩展比较困难。因此急需设计出一套契合马拉松赛事组织全流程,采用现代轻量级技术栈的专用管理系统来解决传统模式下出现的效率低下、信息壁垒、资源浪费等问题。
论文的研究意义
本文以Node.js为平台,创建马拉松赛事管理系统的参赛用户、组委、管理员三级权限体系,包含赛事类型管理、赛事信息发布、在线报名缴费、报名信息审核及管理、成绩导入查询、评价反馈、网站公告管理、新闻资讯分类管理、通知中心、物料出入库跟踪等内容。相比传统的手工管理模式,系统可以使得报名信息的处理和审核达到即时的效果,支持组委批量导入成绩、批量审核报名、批量导出报名数据等操作,极大地缩短了成绩公布的时间。物资库存模块设有独立的物料管理、入库记录、出库记录三个子模块,物资数量每次入库或者出库都会自动更新,避免了传统方式下出现的账实不符情况,可以对物料从供应商入库到最后组委会领取再到使用到参赛包发放全过程进行追踪。组委用户可监视各种赛事物资消耗状况,假如库存低于规定的数量,就会发出警告信号,促使组委尽快购买并补货。管理员管理赛事种类、新闻信息、分类的发布权限。系统也给参赛用户提供个人中心,可以对参赛者进行个人信息的修改和报名记录查询、成绩查看、缴费状态查询、已参加赛事的评价提交等操作,评价信息经过组委审核之后在前台展示,形成一个赛事口碑的闭环管理。该系统给赛事组织方提供准确、可追溯的决策数据支持,缩减人工统计和重复核对造成的时间和人力耗费,削减因为数据错乱引发的物资超采或者缺少的危险。对参赛选手来说,该系统给参加者提供从比赛查找,网上报名,网上支付,成绩查询和评价反馈等各方面服务的便利性,从而改善参赛者的参赛体验和服务水平。系统使用Node.js作为运行环境,Spring Boot作为后端框架,Vue作为前端技术,MySQL作为数据存储,整个技术栈轻量化、统一,降低部署和运维门槛,利于后续功能拓展和二次开发,对推进中小型马拉松赛事的标准化、高效化和可持续化运作有明显的实际应用价值和社会意义。
国内外研究现状
1.3.1 国内外发展综述
我国国内马拉松赛事管理研究伴随着全民健身战略的实施而越来越深。早期的研究主要是赛事安全和风险管理方面的,用传统的案例分析法和问卷调查法进行研究。近三到五年学术关注点转移到了数字化转型和改进上。研究者开始考察科技手段对于赛事组织效率的支持情况。技术发展由原来的单一模块信息化发展为现在的多业务协同管理。系统形态由原先的独立工具变为如今的涵盖报名、发布信息、反馈评价等各个方面的综合型平台。从大型城市马拉松到县级比赛的管理需求下移。这就给本系统使用轻量级的技术栈进行全流程的管理提供了一个现实的背景。
2025年吴仲婷、宋帅豪研究出科技赋能中国马拉松赛事管理数字化转型的途径,认为技术可以提高报名信息处理和物资调配的速度3。该研究给本系统物料出入库管理模块的设计提供理论基础,有利于物资流转可追溯。祁亚亚在2025年的研究中认为对于赛事的管理和控制要重视参赛者的资料是否准确以及通知是否及时4。这使本系统产生了一个通知中心模块,用以分类消息的发送来提高重要的信息获取几率。2023年杨阳对云南省马拉松比赛的安全问题做了进一步的研究,认为信息交流缺失为造成的问题5。本系统用参赛用户、组委、管理员三个等级的权限划分来保证信息有权限的查看和修改。2022年李昱用新媒体视角研究了我国马拉松赛事信息提供服务,认为参赛者对于成绩查询和赛事信息的需求比较及时6。这给本系统设计新闻资讯模块以及成绩信息查看功能赋予了支撑作用,从而达成内容分类并加快检索的目的。2021年李云以婺源国际马拉松为样本展开县级城市赛事组织管理机制研究,发现由于信息展示及报名渠道的分散,导致用户体验被削弱7。本系统把赛事信息展示和在线支付结合起来,创建起一个由浏览到报名缴费全部过程的闭环。2021年曹鹏程研究了江苏金牌马拉松赛事运营管理,提出对参赛报名信息、成绩导入进行批量处理的需求8。从而给本系统组委用户的信息管理模块、成绩管理模块提供启示,实现批量审核、导入的功能。
国内关于马拉松赛事安全管理的研究涵盖了赛事安全、信息服务、组织机制等诸多方面,给马拉松赛事管理打下了理论基础。现有的研究成果大多集中在某一个环节的改善上,缺少一个从赛事信息、报名缴费、成绩评价、物料库存等各个方面都进行覆盖的管理系统。县级赛事和中小型比赛缺少对物资追踪、多角色协同的功能。近些年行业趋向于轻量型、快部署。本系统从功能方面弥补以上缺陷,设置赛事类型管理、新闻资讯分类、评价信息审核、物料出入库跟踪等模块,从而达到对已有研究的改进和扩展的目的。针对中小型赛事实际需要,本系统把公告管理、通知中心以及支付功能结合在一起,从而提高用户的使用体验以及组织的效率。
国外马拉松赛事管理研究早于我国,应用技术比我国更普遍。研究重点由原来的医疗保障单向延伸到了组织间的合作以及参赛者的参与状况两方面。近几年来,物联网技术和偏好的评价方法开始进入赛事管理系统之中。国外系统大多使用轻量级的框架来实现一些模块的优化工作,并且十分看重数据驱动决策以及用户体验的改善。整体上呈服务精细化、模块可配置化的趋势。因此,本文将本系统采用轻量级部署的方式使用Node.js技术栈进行系统开发。
2025年Ogawa等人以医疗支持视角对市民马拉松安全管理工作进行回顾,重视赛事报名信息同健康状况相关联的管理9。启发本系统在报名信息管理上把参赛者的姓名、身份证号等基本信息以及缴费状态一起纳入考虑,给组委提供完整的报名视图。2025年Yi等人用偏好的方式研究了城市马拉松赛事体验中评价反馈对于参加者的满意度有怎样的影响10。本系统设计了成绩信息查看、评价信息管理模块,参赛者可以提交反馈,经过组委审核之后显示出来,形成服务质量闭环。2022年Angeliki、Konstantinos等人对大型集会的组织间沟通进行研究,认为赛事信息传递、公告发布要靠统一平台来实现11。这就给本系统网站公告管理模块提供了思路,实现了消息集中发布和查看的功能。2022年Leou等人对物联网技术在马拉松赛事中的应用展开研究,以体育旅游、城市发展为视角给出物资库存追踪的方法12。本系统物料库存管理、入库管理、出库管理这三个子模块依靠数据库相互关联来达成库存数量自动变动,给物资流向追踪赋予了技术手段。张婷2026年提出城市马拉松赛事安全保障体系建设的路径有赛事类别划分、成绩信息标准化等可以用来作为安全评价的依据。这就引发了本系统建立赛事类型管理模块的设计思路,即由管理员对分类进行统一的管理维护工作,保证赛事信息及成绩录入的规范性。
国外有关医疗支持、组织沟通和技术应用等各方面已经有了一定的成熟度。功能设计重视用户体验和数据标准,物联网的思想给物资追踪赋予了新的角度。但是部分研究依靠专业设备或者外部平台来完成,部署成本较大。本系统借鉴国外研究中有关偏好分析、信息标准化、库存追踪等方面的先进思想,以中国的县级城市和中小型赛事为应用场景,对之做本土化的改良。使用vue和nodejs纯软件的方案,不需要硬件依赖。整合出新闻资讯分类、评价审核、通知中心等各方面的功能来满足本土赛事对于成本低、快速部署的需求
1.3.2 马拉松赛事管理系统功能发展
马拉松赛事管理功能由原来的分散型工具变成现在的集成化平台。早期的管理用电子表格来处理报名信息、成绩数据,组委人员存在着信息同步迟缓、人工核对出错等现实问题。伴随着Web技术的普及,出现了单独存在的在线报名系统以及成绩查询模块。近五年的研究关注点也扩大到了物资的跟踪和多角色协同管理。现有的系统试图将赛事信息发布的功能、报名缴费的功能、成绩管理的功能、评价反馈的功能进行整合,但是大多数方案没有建立起统一的权限体系以及数据流转的机制。县级马拉松赛事组织管理的研究中,对赛事信息展示和报名过程进行整合就显得很重要。多目标管理机制顾及到组委的操作效率以及参赛者的感觉,在系统之后会采用模块化的设计来提升其功能的可扩展性。未来趋势是轻量化技术栈的使用以及物资库存的即时管理,用node.js这些非阻塞I/O模型来推动小型赛事组织向全流程的管理中心发展。
1.3.3 马拉松赛事管理系统技术发展
赛事管理系统技术架构正在由原来的重型框架向轻量级的框架发展。早期系统多使用PHP或者Java技术栈来实现,部署环境要求较高,二次开发难度大。Node.js依靠事件驱动以及非阻塞I/O特性逐渐进入到体育管理当中。医疗支持视角的马拉松安全管理研究用数据驱动的方式改善报名审核程序。物联网思想被用来进行物资追踪模块的开发,但是大部分方案使用了专用的硬件设备。就数据一致性问题和多个用户之间的权限管理来说,JWT鉴权技术以及RESTful API的设计方法是主要的。MySQL关系型数据库具有事务以及数据完整性等特性。未来趋向是前后端分离架构的深度融合以及物料出入库的自动化,用轻量级框架来实现小赛实的低成本部署。它在提高组织效率的同时也会产生数字时代赛事管理新模式。
本文的主要工作
1.4.1 本文研究目标
研究目的就是建立基于node.js的马拉松赛事管理系统,将赛事信息发布、报名缴费、成绩统计、评分评价、物资追踪等主要功能结合起来,克服了传统的使用人工方式来完成工作的低效问题和信息不能及时掌握、物资的库存情况无法及时得知等问题,从而推动了赛事组织更加规范化,使得资源配置更有效,尝试寻找一种新的协作方式以及轻量级的技术架构,给小型马拉松赛事提供方便、安全、可扩展的管理工具。设计马拉松赛事管理系统的主要功能有以下几点:
(1)系统平台具有参赛用户注册登录及赛事信息浏览功能。
(2)可以在搜索栏输入关键字对现有赛事进行多条件复合检索,由系统给出检索后的赛事列表信息。
(3)网站的权限管理由管理员进行操作,包括赛事类型管理、新闻资讯管理、用户管理以及评价信息管理等功能模块。
(4)用户可以对所选赛事先存放在报名意向列表,用户在最终提交时可以在列表内完成批量报名。
(5)界面对报名信息进行修改或删除,用户通过系统的支付功能完成报名费用的订单支付。
(6)系统可以全面管理物资的入库与出库信息,提供准确及时的库存数据统计结果,以列表或图表形式呈现统计信息,组委与管理人员能够实时掌握物料消耗情况
1.4.2 本文研究内容
(1)平台功能设计。对赛事马拉松赛事管理系统的各项主要功能进行分析与设计,即用户注册与登录、赛事信息发布与查询、在线报名与支付、成绩查询与评价、物料出入库等,考虑怎样实现对小型赛事实时性的支持,提高系统实用性和操作速度。
(2)用户行为分析。通过用户使用的记录和操作的日志来收集数据,对参赛用户的使用行为、组委用户的使用行为以及两者的功能喜好进行分析。分析用户各个模块的交互行为来提高界面的设计和操作流程的优化程度,增加用户的满意度以及系统的粘性。
(3)多角色权限管理机制。探究怎样创建有效的权限控制体系,在赛事管理系统当中包含参赛用户、组委和管理员这三个角色的划分以及JWT接口鉴权的做法,用户角色同功能模块之间的绑定机制。对这些权限管理措施所具有的数据安全性保障作用进行分析,同时探讨如何依靠技术手段来减小信息越权访问的风险。
(4)数据安全与隐私保护。对马拉松赛事管理系统在报名信息、成绩数据、支付记录等数据处理和存储过程中所可能面临的安全威胁进行剖析,探究有关数据加密和访问控制的方法,使用户的个人信息和交易数据得到安全保障以及隐私性保护。
(5)系统的部署及运营策略。探究赛事管理系统推广方法、轻量化部署方式以及可持续发展路径,考察不同的技术选择对系统响应速度和并发处理能力的影响,给系统长期维护和功能拓展提供意见。
本文组织结构
论文的组织架构为:
第1章:绪论。对马拉松赛事管理领域进行深入探索,介绍本系统的研究背景与现实意义,阅读相关参考文献获悉国内外的研究现状,结合中小型马拉松赛事组织的实际需求完善论文主要研究内容,列出大致文章组织架构。
第2章:相关技术介绍。对实现本系统开发所需要的软件工具及相关技术要点进行阐述,详细说明每项技术的设计缘由、应用范畴及所涉及的技术关键词,包括Node.js运行环境、Spring Boot后端框架、Vue前端框架、MySQL数据库等,为下一步系统的开发设计做好技术准备。
第3章:系统分析。在制作系统之前查阅相关资料,进行系统分析,构建大致逻辑框架。根据赛事管理流程与用户需求,对管理系统的各项功能进行详细分析,包括需求分析、业务流程分析及用例分析等方面。
第4章:系统设计。采用模块化设计理念,系统梳理数据库表间的逻辑关联,构建起系统整体架构图。着重探讨三级权限管理方案,划分参赛用户、组委、管理员各自的功能边界与操作权限,为系统功能实现筑牢基础。
第5章:系统实现。按功能模块依次展开,详细介绍各模块功能的具体实现过程,包括赛事信息管理模块、报名信息管理模块、成绩信息管理模块、评价信息管理模块、物料出入库管理模块、新闻资讯管理模块等。同时展示功能在前端页面的直观呈现效果,展现系统从设计蓝图到实际应用的落地成果。
第6章:系统测试。针对系统各功能模块进行全面测试,通过科学严谨的测试流程验证平台的可用性与稳定性,包括单元测试、集成测试与性能测试,确保系统满足设计要求。
结论:对研究工作进行全面总结,系统分析开发过程中遭遇的技术难题与系统现存不足,基于此对后续研究方向提出前瞻性展望,包括移动端适配、数据可视化分析、与第三方支付平台深度对接等,为进一步优化系统指明方向。
第2章 相关技术介绍
开发语言概述
本系统后端主要使用Java和JavaScript进行开发。Java是面向对象的静态类型语言,依靠Java虚拟机来达到跨平台运行的目的。强类型检查是在编译的时候就检测到类型的错误,从而减少运行时的异常。Java的标准库中包含很多的集合类以及并发工具包,利用多线程编程模型可以最大限度地发挥出多核处理器的优势。垃圾回收机制可以自动地管理堆内存,不需要开发者手动去释放已经不再使用的对象。Java在服务端应用方面有着很多企业的实践,并且生态系统比较成熟稳定。Node.js的服务器端使用的是JavaScript语言,与前端共用基本的语法基础,减小全栈开发的学习成本。JavaScript的动态类型特点加上原型继承,使代码具有了更高的灵活性。事件循环以及异步编程模型借助回调函数或者Promise对象来处理非阻塞操作,很适合用于I/O密集型赛事信息查询和通知推送的情况。前端Vue.js是基于JavaScript语言,用ES6规范引入的箭头函数、解构赋值以及模块化语法来提高代码可读性的。TypeScript作为JavaScript的超集可以提供选择性的类型检查,并且与Vue.js框架搭配使用,可以提高大型项目代码的维护性。
Spring Boot
Spring Boot框架是在Spring生态系统的基础上开发的,使用自动配置来大大减少项目的初始化搭建成本。该框架用约定优于配置的理念来替代传统Spring应用里繁杂的XML配置文件,使用简单的注解和默认配置。内嵌的Tomcat、Jetty或者Undertow服务器使应用可以独立打包成一个JAR文件然后直接运行,不需要把WAR包部署到外部的容器里。Spring Boot提供一系列starter来管理依赖,开发者只需要引入相应场景的starter模块就可以得到对应的依赖和默认配置。该框架在Web应用开发中表现很好,在处理报名信息管理、成绩信息管理这些业务逻辑的时候,可以用控制层注解快速创建RESTful接口。框架内置的Actuator模块可以实现运行时对系统的运行状况进行查询的功能。Spring Boot集成数据访问层支持,可以和MySQL等关系型数据库无缝对接,使用JPA或者MyBatis进行对象关系映射。该框架给组委用户和管理员的操作界面背后的业务逻辑处理赋予了稳定的运行环境,保证赛事信息的管理、物料出入库的管理等等模块的数据一致、事务完整13。
Node.js
Node.js基于Chrome V8引擎构建JavaScript运行环境,拓展JavaScript的应用范围至服务器端。事件驱动和非阻塞I/O模型是该平台的主要特点,每一个连接都会产生一个回调函数,而不是独立的线程,因此系统的资源消耗大大减少。由于Node.js可以管理大量的并发请求,所以Node.js对并发的处理能力很强,在单个进程中可以支持数十万甚至上百个并发链接。Node.js使用单线程事件循环的方式,不会出现多线程编程中锁竞争、上下文切换等问题。npm包管理工具提供超过百万个开源模块,开发者可以自由调用SpringBoot、Socket.io等第三方库提高开发速度。对马拉松赛事管理系统中新闻资讯查看、赛事信息查看模块来说,Node.js可以有效地处理前端发起的查询请求。平台可以搭建简单的HTTP服务器,路由解析和中间件处理也比较灵活。文件系统模块以及流处理功能有利于公告的附件或者成绩单的上传下载。Node.js的非阻塞特性非常适合于I/O密集型的应用场景,赛事信息浏览、通知中心消息推送等都是典型的I/O密集型应用14。
Vue.js
Vue.js使用声明式的渲染和组件化开发,从而降低由于直接操作DOM而引起的性能损耗。响应式数据绑定机制可以自动追踪数据的依赖关系,在数据发生改变的时候,视图层就会做出精确的更新。虚拟DOM技术把多次的数据变动合成一批次的改变,再算出最细微的不同之后才动手执行实际的DOM操作,从而加快页面的重绘速度。Vue的单文件组件把模板、脚本和样式封装在一个文件里,从而达到组件间逻辑复用以及样式隔离的目的。指令系统包含v-if、v-for、v-bind这些内置的指令来处理条件渲染和列表渲染。生态系统由Vue Router和Vuex或者Pinia这些状态管理库来实现前端路由以及全局状态共享的功能。在参赛用户的端上用vue.js来完成注册登陆表单的双向绑定验证以及支付费用页面的动态交互。组件化的性质使评价信息的管理界面可以拆分成评分模块、评论列表模块和提交模块,从而达到减少代码耦合的效果15。虚拟DOM的高效diff算法使得成绩信息查看页面数据更新的时候只刷新发生变化的地方。
MySQL
MySQL使用多线程和查询缓存来提高数据的检索速度。存储引擎架构支持InnoDB、MyISAM等不同类型的存储引擎,其中InnoDB提供事务支持和外键约束,保证多表关联操作的数据一致性。B+树索引结构把数据和索引分成两层存储,范围查询、等值查询都可以用索引来快速找到记录行。MySQL支持主从复制、分区表等扩展,读写分离部署方式可以将查询请求分配到各个从库上。ACID事务特性通过redo log与undo log实现崩溃恢复与回滚操作16。在马拉松赛事管理系统当中,用MySQL保存赛事类型表,赛事信息表,报名记录表,成绩表,评价表,物料库存表,公告表,新闻资讯表以及用户表等各类业务数据。报名信息管理模块中的关联查询要联系用户表、赛事表和报名记录表,事务处理保证报名和扣减库存操作的原子性。物料出入库管理中用到的是库存表的行级锁以及更新操作,MySQL并发控制可以避免出现数据错误。
前后端分离架构
前后端分离架构把用户界面和数据处理逻辑解耦,前端只做视图渲染和交互响应,后端做业务逻辑和数据持久化。前端项目独立部署到静态资源服务器或者CDN上,后端服务以API的形式对外提供数据接口。双方用HTTP协议发送JSON格式的数据进行交流,契约测试以及接口文档生成工具可以提高合作速度。该架构可以使得前端和后端团队同时进行开发工作,技术栈之间没有互相制约。马拉松赛事管理系统用该架构之后,Vue.js构建的单页应用做参赛用户端赛事浏览、报名缴费和成绩查询的操作,Spring Boot构建的后端服务处理赛事信息管理、报名信息审核和物料库存核算等工作。前后端利用JWT令牌实现用户的登陆以及权限的判断,组委用户和管理员的后台操作也是通过同一个API完成的。接口版本管理机制可以保证在升级后端的过程中,后端仍然可以和旧版前端进行交互。分层架构的分离特性使系统扩展性提高,可以独立更换前端框架或者后端语言来实现技术升级17。
本章小结
本章对马拉松赛事管理系统开发所需要的主要技术进行了系统的介绍。后端使用的是Spring Boot框架,用自动配置和内嵌服务器的特点简化了项目的搭建过程,给赛事信息管理、报名审核、物料核算这些业务逻辑的运行打下了良好的基础。由于使用了事件驱动以及非阻塞的I/O模型,因此Node.js平台可以很好地处理赛事用户在赛事浏览、赛事通知等并发请求上的处理。前端用vue.js框架,用响应式的数据绑定和组件化开发模式来搭建用户的交互界面,可以支持注册登录、报名缴费、评价反馈等各个模块动态展示的效果。MySQL关系型数据库存储赛事类型、报名记录、成绩数据、物资库存等各方面的业务信息,用事务来保证多个表之间的数据一致。前后端分离架构把视图层和数据层解耦,前端独立部署,调用后端RESTful接口,使用JWT令牌做三级用户权限校验。上述技术一起构成系统的底层技术支撑,给后续的系统分析、设计、实现和测试工作打下基础。
第3章 系统分析
前期调研
伴随着全民健身战略的不断推进,马拉松赛事数量及参加人数也日益增多,赛事的管理和工作也越来越繁杂。对于赛事组织方来说,高效处理报名信息、准确登记成绩、合理调配物资是保证赛事正常开展的重要环节;对于参赛用户来说,方便的赛事查询、快捷的报名缴费、及时的成绩反馈则是评价赛事质量的标准之一。这就为马拉松赛事管理系统开发赋予了现实需要。互联网技术广泛使用的时候,各种体育赛事管理平台逐渐出现,但是马拉松赛事参加人数众多、物资种类繁杂、信息传递迅速等特点使得通用型活动管理软件不能完全满足赛事组织过程中对于物资追踪、多角色协同、实时通知等专业化的需要。很多中小型马拉松赛事还存在着手工填写报名表、手工打印成绩单的现象,急需建立一个贯穿全过程的管理系统。
马拉松赛事管理系统与一般的活动报名系统虽然存在一定的相似之处,但是它们之间存在着明显的区别。从功能本质上看,二者都是以互联网为媒介实现信息发布和用户报名的,但是马拉松赛事管理系统的用户群体被划分为参赛用户、组委、管理员三个角色,业务流程包含赛事信息发布、在线报名缴费、成绩录入查询、评价反馈审核、物料出入库追踪等众多环节。马拉松赛事管理系统业务链比通用报名系统要长很多,角色权限也更细致,数据之间联系也更为复杂,最主要的是对物资库存的实时性要求高和成绩数据的准确度要求高。通过马拉松赛事组织流程的研究来整理出系统的功能:
(1)系统平台具备参赛用户注册、登录功能。同时提供赛事信息展示功能,支持用户浏览各类马拉松赛事的基本信息与赛事详情。
(2)支持用户在搜索栏输入关键字,对赛事进行多条件复合检索,包括按赛事类型、举办时间、举办地点等条件筛选,并由系统展示检索后的赛事列表信息。
(3)系统管理员与组委用户共同承担平台权限管理职责,涵盖赛事类型管理、赛事信息管理、报名信息审核、成绩信息录入、评价信息审核、物料库存管理、网站公告管理、新闻资讯管理等,保障赛事组织秩序。
(4)参赛用户可将意向赛事添加至报名列表,在最终提交报名前,可在报名界面对报名信息进行修改或取消操作,通过集成支付功能完成报名费用缴纳,提升报名流程的便捷性与完整性。
功能需求分析
3.2.1 赛事信息管理功能
在马拉松赛事管理系统中,赛事信息管理主要是对赛事核心数据的维护。系统用户分为管理员、组委用户和参赛用户。管理员拥有赛事信息管理的全部权限,可对所有赛事信息进行添加、修改和删除操作。组委用户负责具体赛事的日常管理,可发布新赛事、修改已发布赛事信息。参赛用户未登录时仅能浏览赛事列表,若要进行报名等操作则必须登录系统。该系统采用前后端分离架构设计,赛事发布时赛事名称具有唯一性,不允许重复,若存在重复名称会显示"赛事已存在",以此保证系统的严谨性。
赛事信息管理功能的用例图如图3-1所示。

图3-1赛事信息管理功能用例图
赛事信息管理功能流程图如图3-2所示。

图3-2赛事信息管理功能流程图
3.2.2 报名信息管理功能
(1)报名提交
参赛用户可以选择自己所要参加的赛事进行报名,系统要求填写参赛者姓名、性别、身份证号等必要信息,所有必须填写的内容需要填写完整,否则报名不成功。
(2)报名审核
组委用户对参赛用户提交的报名申请进行审核,审核通过后参赛用户方可进入缴费环节。审核不通过的报名需注明原因退回。
(3)报名修改
在报名截止日期之前,参赛用户可以修改已提交的报名信息。报名截止后报名信息锁定,不可再进行修改操作。
(4)支付管理
参赛用户对审核通过的报名进行在线缴费,支持微信支付和支付宝两种支付方式。缴费成功后报名状态变更为已缴费。
(5)参赛号码生成
报名审核通过后系统自动为参赛用户生成唯一参赛号码,该号码用于赛事当天的身份识别与成绩记录。
报名信息管理功能的用例图如图3-3所示。

图3-3报名信息管理功能用例图
报名信息管理流程图如图3-4所示。

图3-4报名信息管理流程图
3.2.3 成绩信息管理功能
(1)成绩录入
组委用户在赛事结束后可以录入参赛选手的完赛成绩,支持单个录入和批量导入两种方式。成绩录入时需填写参赛号码、完赛成绩、完赛时间等信息。
(2)成绩审核
管理员对组委录入的成绩数据进行审核,审核通过后成绩信息方可向参赛用户开放查询。审核不通过的成绩需退回并注明原因。
(3)成绩查询
参赛用户可以在系统中查询自己的完赛成绩,成绩信息包括参赛号码、枪声成绩、净成绩、完赛排名等详细数据。
(4)成绩证书生成
系统根据参赛用户的完赛成绩自动生成电子完赛证书,参赛用户可在成绩查询页面下载保存。
成绩信息管理功能的用例图如图3-5所示。

图3-5成绩信息管理功能用例图
成绩信息管理流程图如图3-6所示。

图3-6成绩信息管理流程图
3.2.4 物料出入库管理功能
(1)物料入库
组委用户可以将赛事所需物资进行入库登记,填写物料名称、物料类型、入库数量、供应商信息等内容。入库成功后系统自动更新对应物料的库存总量。
(2)物料出库
组委用户在发放参赛包或赛事物资时执行出库操作,出库时需填写出库数量、领取人、出库用途等信息。出库成功后系统自动核减物料库存数量。
(3)库存查询
组委用户和管理员可以实时查询各类物料的当前库存数量,支持按物料名称、物料类型等条件进行筛选搜索。
(4)库存预警
系统对物料库存设置最低库存阈值,当某类物料库存数量低于预设阈值时自动向组委用户发出预警提示。
物料出入库管理功能的用例图如图3-7所示。

图3-7物料出入库管理功能用例图
物料出入库管理流程图如图3-8所示。

图3-8物料出入库管理流程图
3.2.5 评价信息管理功能
(1)评价提交
参赛用户在完成赛事后可以对赛事进行评价留言,包括赛事组织满意度、赛道体验、补给站服务等内容。所有评价需填写评价内容才能提交。
(2)评价审核
组委用户对参赛用户提交的评价进行审核,审核通过的评价在前台页面展示。含有违规内容的评价可执行驳回或删除操作。
(3)评价回复
组委用户可以查看并回复参赛用户的评价,回复内容与原始评价一同在前台页面展示。
(4)评价查看
参赛用户和其他用户可以在赛事详情页面查看已通过审核的评价内容及组委回复。
评价信息管理功能的用例图如图3-9所示。

图3-9评价信息管理功能用例图
评价信息管理流程图如图3-10所示。

图3-10评价信息管理流程图
3.2.6 新闻资讯管理功能
(1)资讯发布
管理员可以发布关于马拉松运动的新闻资讯,包括赛事新闻、跑步知识、训练技巧、运动装备推荐等内容。资讯发布时需选择所属分类。
(2)资讯分类管理
管理员可以对新闻资讯进行分类设置,包括添加分类、修改分类名称、删除分类等操作。分类管理有助于参赛用户快速定位感兴趣的资讯内容。
(3)资讯浏览
参赛用户可以在系统中浏览各类新闻资讯,支持按分类筛选和按发布时间排序。用户可对感兴趣的资讯进行收藏或分享。
(4)资讯编辑
管理员对已发布的资讯内容进行修改,修改保存后前端页面同步更新展示最新内容。
新闻资讯管理功能的用例图如图3-11所示。

图3-11新闻资讯管理功能用例图
新闻资讯管理流程图如图3-12所示。

图3-12新闻资讯管理流程图
3.2.7 网站公告管理功能
(1)公告发布
管理员负责发布系统层面的重要公告,包括赛事延期通知、报名截止提醒、系统维护通知等内容。公告发布时需填写公告标题和正文内容。
(2)公告置顶
管理员可将重要公告设置为置顶状态,置顶公告在公告列表最上方展示,便于用户第一时间获取关键信息。
(3)公告下线
管理员对过期或已失效的公告执行下线操作,下线后的公告不再在前端页面显示。
(4)公告查看
参赛用户和组委用户登录系统后在首页公告栏查看最新公告,点击公告标题可查看完整公告内容。
网站公告管理功能的用例图如图3-13所示。

图3-13网站公告管理功能用例图
网站公告管理流程图如图3-14所示。

图3-14网站公告管理流程图
非功能需求分析
3.3.1 可用性
参赛用户没有登陆只能看赛事信息、新闻资讯。注册时系统会对用户名是否唯一进行校验,如果重复则会给出明显的提示。登录以后不同的用户进入各自的操作界面,菜单功能根据权限自动加载。赛事列表按日期和类型查找、检索。报名流程被拆分成信息填写、提交确认、支付缴费三个环节,每一个环节之后系统给出反馈。通知中心主要展示审核结果、缴费情况等内容,未读通知用标记来区别。物料出入库界面有独立的入库、出库登记入口,不能出现操作混淆的情况。
3.3.2 可靠性
报名信息提交之后用数据库事务机制持久化存储,网络断开的时候也不会造成数据的不完整。成绩导入时系统一行行校验格式,有错的行生成日志,正确的数据批处理写入。物料库存数量在每次出入库操作之后会立刻重新计算,操作记录以及库存变动都处于同一个事务内完成。支付回调接口使用幂等设计,重复请求不会造成重复扣款。用户密码用不可逆加密存储,原始密码不会保存到日志里。系统定时查看报名及成绩数据的完整状况,对出现的异常予以管理员页面的警示显示。
3.3.3 安全性
敏感信息用加密通道来传送。参赛者不能进入组委用户的成绩录入和物料管理界面。组委用户只对自己所负责的赛事数据进行管理,跨赛事数据无法查看。管理员不能得到用户的原始密码。报名截止之后,对应的赛事信息就会变成只读状态。物料出库操作实行二次确认制,超时无响应会把权限关掉。登录五次以上就会被账户暂时锁定三十分钟。通知推送只对指定的用户。
3.3.4 可维护性
赛事类型与新闻资讯分类由管理员后台统一维护,修改后前端同步更新。成绩录入后可在审核前修改,审核通过后需管理员撤销方可更正。入库与出库记录分表存储,可按时间范围分别导出。网站公告支持置顶操作与定时下线,下线后自动从首页移除。
本章小结
本章主要对马拉松赛事管理系统进行系统的分析。前期调研阶段确定出中小型马拉松赛事的报名审核、成绩管理、物料追踪和多角色协同等现实需要,系统要包含参赛用户、组委用户和管理员这三个角色。功能分析阶段用用例图和用例关系表对各个角色可以执行的操作进行详细的描述,参赛用户包括注册登录、赛事浏览、报名缴费、成绩查询、评价反馈和通知接收等功能;组委用户负责赛事信息的管理、报名审核、成绩录入、评价回复和物料出入库管理;管理员负责赛事类型的设定、赛事信息的设置、报名数据的管理、成绩数据的管理、评价内容的管理、物料库存的管理、网站公告的发布、新闻资讯的发布和资讯分类的管理等全局配置。非功能性需求分析是从可用性、可靠、安全、可维护这四个角度来规定系统的约束条件,即角色权限隔离、数据传输加密、事务一致性保证、库存自动更新、登录失败锁定等。上述的分析内容给后面的设计与实现提供完整的依据。
第4章 系统设计
根据前面章节的分析结果得出马拉松赛事管理系统的功能边界以及各方面的用户权限。本章主要对系统总体架构、功能模块划分、数据库设计、核心业务流程做详细的阐述,通过系统整体结构的规划、各个模块之间逻辑关系的梳理、技术框架的选型设计来完成系统总体设计工作。科学合理的设计方案可以降低开发过程中各个模块之间的耦合程度,也可以消除各个模块之间由于逻辑上的冲突或者数据上的冗余所造成的矛盾,使之后的编码实现工作有条不紊地开展。
系统架构设计
系统采用前后端分离的模块化设计思想,将整体架构划分为前端交互层、后端业务逻辑层与数据持久化层。前端基于Vue.js构建用户界面,参赛用户通过浏览器访问赛事浏览、报名缴费等功能页面,组委与管理员登录后进入对应的管理视图。后端基于Node.js与Spring Boot框架搭建服务端,接收前端通过HTTP协议发送的请求。Controller层对请求进行初步解析与路由分发,Service层封装具体业务规则,处理报名审核、成绩录入、库存更新等核心操作。DAO层负责与MySQL数据库交互,执行数据查询与写入任务。本地缓存机制存储赛事类型列表与公告内容等频繁读取且变更较少的数据,减少数据库访问压力。用户从发起请求到获得响应的完整路径如下:前端页面触发事件后调用Axios库发送异步请求,请求抵达后端Controller后被转发至对应Service方法,Service方法在执行业务逻辑过程中调用DAO接口完成数据持久化操作,处理结果逐层返回至前端完成页面渲染。MySQL数据库存储用户表、赛事表、报名表、成绩表、评价表、物料表、公告表及新闻资讯表等核心数据,支撑系统全流程运行。系统整体架构如图4-1所示。

图4-1系统总体架构图
系统功能模块设计
系统功能结构涵盖参赛服务、赛事管理及系统维护三大核心模块。参赛服务模块为用户提供注册登录、公告浏览、资讯查阅、赛事检索、在线支付、个人资料维护、报名操作、成绩查询、评价反馈及通知接收等完整操作链条。赛事管理模块面向赛事组织工作,包含赛事信息维护、报名资料处理、成绩数据管理、评价内容审核以及物料库存的全流程跟踪,涉及入库登记与出库记录等操作。系统维护模块聚焦基础数据与内容管控,包括赛事类型配置、网站公告发布、新闻资讯编辑及资讯分类设置等后台职能。各模块职责边界清晰,协同支撑赛事运行全流程。该系统功能结构如图4-2所示。

图42系统功能结构图
4.2.1 用户注册登录模块
用户注册登录功能允许参赛者创建个人账户并访问系统。新用户填写用户名及密码等必要信息后提交注册请求,系统校验用户名的唯一性并对密码进行加密存储。注册成功的用户凭借凭证登录系统,登录后获得对应角色的功能访问权限。注册登录时序图如图4-3所示。

图4-3用户注册登录时序图
4.2.2 报名信息提交模块
报名信息提交功能支持参赛者选择意向赛事并发起报名申请。参赛者在赛事列表中选择目标赛事后填写报名所需的个人信息,系统查询当前赛事状态与剩余名额。报名资格校验通过后系统保存报名记录并生成待审核状态,用户可在个人中心跟踪报名进度。报名信息提交时序图如图4-4所示。

图4-4报名信息提交时序图
4.2.3 成绩数据管理模块
成绩数据管理功能使组委用户能够批量导入参赛选手的完赛成绩。组委上传符合格式要求的成绩文件后,系统解析文件内容并对每条成绩数据进行格式校验。校验通过的成绩数据批量写入数据库,系统向组委反馈导入成功的记录数量与存在错误的记录清单。成绩数据管理时序图如图4-5所示。

图4-5成绩数据管理时序图
4.2.4 物料库存跟踪模块
物料库存跟踪功能协助组委用户管理赛事物资的出入库流程。组委发起出库操作时系统查询当前库存数量并与出库申请数量进行比对。库存充足的情况下系统扣减库存数量并生成出库记录,操作完成后向组委展示更新后的剩余库存。物料库存跟踪时序图如图4-6所示。

图4-6物料库存跟踪时序图
4.2.5 赛事类型配置模块
赛事类型配置功能赋予管理员维护赛事分类体系的能力。管理员新增或修改赛事类型时系统检查类型名称是否已经存在,避免重复配置。类型信息通过校验后保存至数据库,前端界面即时刷新展示更新后的类型列表。赛事类型配置时序图如图4-7所示。

图4-7赛事类型配置时序图
4.2.6 网站公告发布模块
网站公告发布功能赋予管理员向所有用户推送系统通知的能力。管理员编辑公告标题与正文内容,可选择是否置顶展示。公告发布后立即在前端公告区域生效,用户登录后可查看公告详情。网站公告发布时序图如图4-8所示。

图4-8网站公告发布时序图
4.2.7 新闻资讯编辑模块
新闻资讯编辑功能支持管理员维护马拉松相关的资讯内容。管理员编写新闻标题与正文,选择合适的资讯分类后提交发布。已发布的新闻支持修改与删除操作,资讯内容变更后前端页面同步更新。新闻资讯编辑时序图如图4-9所示。

图4-9新闻资讯编辑时序图
数据库设计
数据库技术作为数据管理的最有效的手段**18**,在系统的设计中,数据库的设计是非常重要的一环。
下面主要阐述了马拉松赛事管理系统的数据库的E-R图设计以及数据库表的设计。
4.3.1 E-R图
由于系统功能较多,要想抽象出所有实体关系有一定难度,马拉松赛事管理系统的总体E-R图如图4-10所示。

图4-10马拉松赛事管理系统主要E-R图
参赛用户实体主要包括参赛用户id、用户id、用户姓名、用户性别、用户年龄、审核状态、创建时间、更新时间等属性。实体属性图如图4-11所示。

图4-11参赛用户实体属性图
组委用户实体主要包括组委用户id、用户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物料库存实体属性图
物料入库实体主要包括物料入库id、物料编号、物料名称、物料类型、入库数量、入库日期、入库备注、组委用户、创建时间等属性。实体属性图如图4-19所示。

图4-19物料入库实体属性图
物料出库实体主要包括物料出库id、物料编号、物料名称、物料类型、出库数量、出库日期、出库备注、组委用户、创建时间等属性。实体属性图如图4-20所示。

图4-20物料出库实体属性图
4.3.2 数据表设计
本系统一共建立了10张核心业务表,分别是参赛用户表(participating_users)、组委用户表(organizing_users)、赛事类型表(event_type)、赛事信息表(event_information)、报名信息表(enrollment_information)、成绩信息表(achievement_information)、评价信息表(evaluation_information)、物料库存表(material_inventory)、物料入库表(material_receipt)、物料出库表(material_issue),以下是各个表的详细设计19。
参赛用户表主要是用来存储参赛者的基本信息。主要包括user_id、user_name、user_gender、user_age、examine_state等字段。如表4-1所示。
表4-1参赛用户表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | participating_users_id | int | 11 | 参赛用户id |
| 2 | user_id | int | 11 | 用户id |
| 3 | user_name | varchar | 64 | 用户姓名 |
| 4 | user_gender | varchar | 64 | 用户性别 |
| 5 | user_age | varchar | 64 | 用户年龄 |
| 6 | examine_state | varchar | 16 | 审核状态 |
| 7 | create_time | datetime | - | 创建时间 |
| 8 | update_time | timestamp | - | 更新时间 |
组委用户表主要是用来存储赛事组织委员会成员的信息。主要包括user_id、name_of_organizing_committee、address_of_organizing_committee、responsible_personnel、examine_state等字段。如表4-2所示。
表4-2组委用户表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | organizing_users_id | int | 11 | 组委用户id |
| 2 | user_id | int | 11 | 用户id |
| 3 | name_of_organizing_committee | varchar | 64 | 组委名称 |
| 4 | address_of_organizing_committee | varchar | 64 | 组委地址 |
| 5 | responsible_personnel | varchar | 64 | 负责人员 |
| 6 | examine_state | varchar | 16 | 审核状态 |
| 7 | create_time | datetime | - | 创建时间 |
| 8 | update_time | timestamp | - | 更新时间 |
赛事类型表主要是用来对赛事进行分类管理。主要包括event_type、create_time、update_time等字段。如表4-3所示。
表4-3赛事类型表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | event_type_id | int | 11 | 赛事类型id |
| 2 | event_type | varchar | 64 | 赛事类型 |
| 3 | create_time | datetime | - | 创建时间 |
| 4 | update_time | timestamp | - | 更新时间 |
赛事信息表主要是用来存储马拉松赛事的详细内容。主要包括event_name、event_type、event_location、event_time、enrollment_amount、event_content、route_specificss、organizing_users等字段。如表4-4所示。
表4-4赛事信息表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | event_information_id | int | 11 | 赛事信息id |
| 2 | event_name | varchar | 64 | 赛事名称 |
| 3 | event_type | varchar | 64 | 赛事类型 |
| 4 | event_location | varchar | 64 | 赛事地点 |
| 5 | event_time | varchar | 64 | 赛事时间 |
| 6 | enrollment_amount | double | - | 报名金额 |
| 7 | event_content | text | 255 | 赛事内容 |
| 8 | route_specificss | longtext | 255 | 路线详情 |
| 9 | organizing_users | int | 11 | 组委用户 |
| 10 | create_time | datetime | - | 创建时间 |
报名信息表主要是用来记录参赛者报名赛事的具体信息。主要包括event_name、event_type、event_location、event_time、entry_number、user_name、enrollment_amount、pay_state、examine_state、participating_users等字段。如表4-5所示。
表4-5报名信息表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | enrollment_information_id | int | 11 | 报名信息id |
| 2 | event_name | varchar | 64 | 赛事名称 |
| 3 | event_type | varchar | 64 | 赛事类型 |
| 4 | event_location | varchar | 64 | 赛事地点 |
| 5 | event_time | varchar | 64 | 赛事时间 |
| 6 | entry_number | varchar | 64 | 参赛号码 |
| 7 | user_name | varchar | 64 | 用户姓名 |
| 8 | enrollment_amount | double | - | 报名金额 |
| 9 | pay_state | varchar | 16 | 支付状态 |
| 10 | examine_state | varchar | 16 | 审核状态 |
| 11 | participating_users | int | 11 | 参赛用户 |
成绩信息表主要是用来存储参赛者的完赛成绩数据。主要包括event_name、event_type、event_location、event_time、entry_number、user_name、indivuser_idual_achievements、achievement_rankings、certificate_of_achievement、participating_users等字段。如表4-6所示。
表4-6成绩信息表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | achievement_information_id | int | 11 | 成绩信息id |
| 2 | event_name | varchar | 64 | 赛事名称 |
| 3 | event_type | varchar | 64 | 赛事类型 |
| 4 | event_location | varchar | 64 | 赛事地点 |
| 5 | event_time | varchar | 64 | 赛事时间 |
| 6 | entry_number | varchar | 64 | 参赛号码 |
| 7 | user_name | varchar | 64 | 用户姓名 |
| 8 | indivuser_idual_achievements | varchar | 64 | 个人成绩 |
| 9 | achievement_rankings | double | - | 成绩排名 |
| 10 | certificate_of_achievement | varchar | 255 | 成绩证书 |
| 11 | participating_users | int | 11 | 参赛用户 |
评价信息表主要是用来存储参赛者对赛事的反馈评价。主要包括event_name、event_type、event_location、event_time、user_name、event_evaluation、evaluation_content、date_of_evaluation、participating_users等字段。如表4-7所示。
表4-7评价信息表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | evaluation_information_id | int | 11 | 评价信息id |
| 2 | event_name | varchar | 64 | 赛事名称 |
| 3 | event_type | varchar | 64 | 赛事类型 |
| 4 | event_location | varchar | 64 | 赛事地点 |
| 5 | event_time | varchar | 64 | 赛事时间 |
| 6 | user_name | varchar | 64 | 用户姓名 |
| 7 | event_evaluation | varchar | 64 | 赛事评价 |
| 8 | evaluation_content | text | 255 | 评价内容 |
| 9 | date_of_evaluation | date | - | 评价日期 |
| 10 | participating_users | int | 11 | 参赛用户 |
物料库存表主要是用来管理赛事物资的当前库存总量。主要包括item_no、item_name、material_type、item_quantity、storage_location、organizing_users、create_time、update_time等字段。如表4-8所示。
表4-8物料库存表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | material_inventory_id | int | 11 | 物料库存id |
| 2 | item_no | varchar | 64 | 物料编号 |
| 3 | item_name | varchar | 64 | 物料名称 |
| 4 | material_type | varchar | 64 | 物料类型 |
| 5 | item_quantity | double | - | 物料数量 |
| 6 | storage_location | varchar | 64 | 存放位置 |
| 7 | organizing_users | int | 11 | 组委用户 |
| 8 | create_time | datetime | - | 创建时间 |
| 9 | update_time | timestamp | - | 更新时间 |
物料入库表主要是用来记录物资补充入库的详细信息。主要包括item_no、item_name、material_type、receipt_quantity、receipt_date、receipt_remarks、organizing_users、create_time等字段。如表4-9所示。
表4-9物料入库表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | material_receipt_id | int | 11 | 物料入库id |
| 2 | item_no | varchar | 64 | 物料编号 |
| 3 | item_name | varchar | 64 | 物料名称 |
| 4 | material_type | varchar | 64 | 物料类型 |
| 5 | receipt_quantity | double | - | 入库数量 |
| 6 | receipt_date | date | - | 入库日期 |
| 7 | receipt_remarks | text | 255 | 入库备注 |
| 8 | organizing_users | int | 11 | 组委用户 |
| 9 | create_time | datetime | - | 创建时间 |
物料出库表主要是用来记录物资发放出库的详细信息。主要包括item_no、item_name、material_type、quantity_of_issue、issue_date、outbound_remarks、organizing_users、create_time等字段。如表4-10所示。
表4-10物料出库表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | material_issue_id | int | 11 | 物料出库id |
| 2 | item_no | varchar | 64 | 物料编号 |
| 3 | item_name | varchar | 64 | 物料名称 |
| 4 | material_type | varchar | 64 | 物料类型 |
| 5 | quantity_of_issue | double | - | 出库数量 |
| 6 | issue_date | date | - | 出库日期 |
| 7 | outbound_remarks | text | 255 | 出库备注 |
| 8 | organizing_users | int | 11 | 组委用户 |
| 9 | create_time | datetime | - | 创建时间 |
系统类图设计
本系统有下列10个实体类:参赛用户类(ParticipatingUsers)、组委用户类(OrganizingUsers)、赛事类型类(EventType)、赛事信息类(EventInformation)、报名信息类(EnrollmentInformation)、成绩信息类(AchievementInformation)、评价信息类(EvaluationInformation)、物料库存类(MaterialInventory)、物料入库类(MaterialReceipt)、物料出库类(MaterialIssue)。系统实体类图如图4-21所示。

图4-21系统类图
本章小结
本章对马拉松赛事管理系统开发过程中用到的相关技术做了详细的说明。后端使用Spring Boot框架,依靠框架的自动配置和内嵌服务器功能简化项目创建过程,给赛事信息管理、报名审核、物料核算这些业务逻辑赋予稳固的执行环境。Node.js平台采用事件驱动以及非阻塞I/O的方式,可以对参赛用户进行赛事的浏览、通知等并发操作的处理。前端使用Vue.js框架,用响应式数据绑定和组件化开发模式搭建起用户的交互界面,可以给各个模块的动态展示效果支持服务。MySQL关系型数据库存赛事类型,报名信息,成绩数据和物资库存等多种业务信息,并用事务来保证多表操作数据的一致性。前后端分离架构把视图层和数据层分离出来,前端单独部署并调用后端的RESTful接口,JWT令牌做三级用户权限校验。以上所述技术一起构成系统的技体制基础,为后面系统的分析、设计、实现以及测试打下基础。
第5章 系统实现
系统开发环境
基于Node.js的马拉松赛事管理系统的设计与实现的开发环境如表5-1所示。
表1系统开发环境表
| 内容 | 开发平台或工具 |
|---|---|
| 操作系统 | Windows操作系统 |
| 开发平台 | Visual Studio Code |
| 后端运行环境 | Node.js |
| 后端框架 | Spring Boot |
| 前端框架 | Vue.js |
| 数据库 | MySQL |
| 数据库管理工具 | Navicat |
| Node.js版本 | Node.js 14.0及以上 |
搭建Spring Boot和Vue框架
马拉松赛事管理系统整合了Spring Boot框架技术进行项目功能的开发和扩展,从而实现系统全部功能。搭建步骤如下:
(1)在环境准备阶段,安装Java开发环境。从Oracle官网下载JDK 11或更高版本并完成安装,配置JAVA_HOME环境变量。在命令行执行java -version和javac -version验证安装成功。安装Maven构建工具,配置MAVEN_HOME环境变量,用于管理项目依赖。
(2)创建Spring Boot项目。使用Spring Initializr在线生成项目骨架,选择Maven项目类型,指定Java版本和打包方式为JAR。添加Spring Web、Spring Data JPA或MyBatis、MySQL Driver等起步依赖。下载生成的项目压缩包并解压到工作目录。
(3)导入项目到开发工具。在IntelliJ IDEA中选择File→Open,选择项目所在的文件夹。IDEA自动识别Maven项目结构并下载依赖包。等待控制台输出构建成功信息。
(4)配置应用属性文件。在src/main/resources目录下找到application.properties或application.yml文件。配置服务器端口号、数据库连接参数、文件上传大小限制及日志级别等选项。设置Spring Boot应用名称和运行环境标识。
(5)创建项目目录结构。在主程序类所在包下按照功能模块划分包结构,包括controller、service、mapper或repository、entity及config等子包。每个子包存放对应层次的Java类文件。
(6)启动Spring Boot应用。在主程序类上执行右键Run或Debug命令启动内置Tomcat服务器。控制台打印Spring Boot启动横幅后显示Started Application字样,默认监听8080端口。
马拉松赛事管理系统采用Vue这种JavaScript前端框架来构建其用户页面。搭建步骤如下:
(1)进行环境准备,安装必要工具。安装Node.js后,在命令行中执行npm install -g @vue/cli来安装Vue命令行工具。安装完成后执行vue --version验证安装成功。
(2)创建Vue项目。打开命令行工具,执行vue create项目名称,例如vue create marathon-frontend。按照提示选择项目配置,选择Vue 3版本并配置路由、状态管理及代码格式化工具。
(3)导入项目到开发工具。在IntelliJ IDEA中选择File→Open,然后选择项目所在的文件夹。IDEA自动识别Vue项目结构,安装Vue.js插件提供语法支持。
(4)安装依赖模块。在项目根目录下执行npm install安装axios、element-plus、vue-router及vuex等依赖包。axios用于发送HTTP请求到Spring Boot后端服务,element-plus提供UI组件库。
(5)配置代理转发。在项目根目录下创建vue.config.js文件,配置devServer选项。设置proxy代理规则,将前端开发服务器请求转发到Spring Boot服务地址,解决跨域访问问题。
(6)运行项目。在终端中执行npm run serve启动开发服务器。服务器启动后在浏览器中访问http://localhost:8080,查看项目运行效果。前端页面与后端Spring Boot应用通过HTTP接口进行数据交互。
数据库连接实现
目前市面上的数据库管理系统种类繁多,常见的包括MySQL、SQL Server、Oracle和Access等。本系统选用MySQL数据库管理系统作为数据存储方案。无论采用何种数据库技术,均需在数据库与应用程序之间建立配置连接,以实现数据的存储与调用。这种连接机制确保了软件系统能够高效地访问和管理后台数据资源。
数据库连接配置文件在项目根目录下的db.js文件中,代码如下:
const mysql = require('mysql2');
const pool = mysql.createPool({
host: '127.0.0.1',
port: '3306',
user: 'root',
password: 'root',
database: 'marathon_db',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
module.exports = pool.promise();
密码加密引入代码如下:
const crypto = require('crypto');
function md5Hash(key) {
const hash = crypto.createHash('md5');
hash.update(key);
return hash.digest('hex');
}
module.exports = { md5Hash };
系统模块实现
5.4.1 用户注册登录实现
用户注册登录功能是系统的入口模块,参赛用户与组委用户通过该模块完成账户创建与身份认证。新用户填写用户名、密码及联系方式后提交注册请求,系统校验用户名的唯一性并对密码进行MD5加密存储。登录时用户提交凭证,系统验证用户状态与审核状态后生成UUID格式的Token,Token存入Redis缓存并设置2小时有效期。登录成功后将用户信息与Token返回前端,后续请求携带Token进行身份识别。用户注册登录页面如图5-1所示。

图5-1用户注册登录页面
实现用户注册登录功能的具体步骤如下:
步骤一:在前端注册组件中定义registerForm对象,包含用户名、密码、确认密码等字段。使用表单校验规则检查密码强度与格式合法性。定义loginForm对象收集登录凭证,通过axios发送POST请求到后端接口。
步骤二:后端UserController接收注册请求,调用service层的select方法查询用户名是否已存在。若用户已存在则返回错误提示,否则调用encryption方法对密码进行MD5加密后执行insert操作保存用户信息。
步骤三:登录时根据用户名查询用户记录,校验用户状态是否为可用状态。验证密码与数据库存储的加密值是否匹配,匹配成功后生成Token并存入Redis。
步骤四:前端接收到登录成功响应后将Token存储到本地,后续请求在请求头中添加x-auth-token字段传递Token。退出登录时调用quit接口清除Redis中的Token记录。核心代码如下:
@PostMapping("register")
public Map<String, Object> signUp(@RequestBody User user) {
Map<String, String> query = new HashMap<>();
query.put("username", user.getUsername());
List list = service.selectBaseList(service.select(query, new HashMap<>()));
if (list.size() > 0) return error(30000, "用户已存在");
user.setPassword(service.encryption(user.getPassword()));
service.insert(JSON.parseObject(JSON.toJSONString(user)));
return success(1);
}
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data) {
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.size() <= 0) return error(30000, "用户不存在");
User user = (User) resultList.get(0);
if (user.getPassword().equals(service.encryption(password))) {
AccessToken accessToken = new AccessToken();
accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
accessToken.setUser_id(user.getUserId());
redisTemplate.opsForValue().set(accessToken.getToken(), accessToken, Duration.ofSeconds(7200L));
JSONObject ret = JSONObject.parseObject(JSONObject.toJSONString(user));
ret.put("token", accessToken.getToken());
return success(ret);
}
return error(30000, "账号或密码不正确");
}
5.4.2 报名信息管理实现
报名信息管理模块支撑参赛用户提交报名申请与组委用户审核报名资格。参赛用户在赛事详情页面填写个人报名信息后提交,系统生成唯一参赛号码并保存报名记录。组委用户在报名审核页面查看待审核列表,可选择通过或驳回操作。审核通过后参赛用户可进行缴费,缴费完成后系统更新支付状态并通知用户,报名信息管理页面如图5-2所示。

图5-2报名信息管理页面
实现报名信息管理功能的具体步骤如下:
步骤一:前端报名组件获取赛事ID后展示报名表单,包含参赛者姓名、性别、身份证号等字段。使用el-form组件绑定validationRules进行前端校验。提交时调用enrollment_information接口的add方法。
步骤二:后端EnrollmentInformationController接收报名请求,从request中读取body参数并构建查询条件。校验参赛号码是否重复,若重复则返回错误信息。调用addEntity方法保存报名记录,初始审核状态设置为未审核。
步骤三:组委在审核页面调用update_examine_state接口,传递报名记录ID与审核状态值。系统根据ID查找报名信息对象,调用setEntity方法更新examine_state字段。
步骤四:审核通过的报名记录允许参赛用户调用update_pay_state接口完成支付状态变更。系统校验支付状态值合法性后更新pay_state字段为已支付。核心代码如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
Map<String,Object> paramMap = service.readBody(request.getReader());
EnrollmentInformation info = new EnrollmentInformation();
info.setEntry_number(String.valueOf(paramMap.get("entry_number")));
Map<String, String> query = new HashMap<>();
query.put("entry_number", String.valueOf(paramMap.get("entry_number")));
if (service.selectBaseList(service.select(query, new HashMap<>())).size() > 0) {
return error(30000, "参赛号码已存在");
}
info.setExamine_state("未审核");
this.addEntity(info);
return success(1);
}
@GetMapping("/update_examine_state")
public String updateExamineState(Long id, String newState) {
Map<String,String> query = new HashMap<>();
query.put("id", String.valueOf(id));
EnrollmentInformation info = service.findOne(query);
if (info != null) {
info.setExamine_state(newState);
this.setEntity(query, new HashMap<>(), info);
return "审核成功";
}
return "审核失败";
}
5.4.3 赛事信息管理实现
赛事信息管理模块允许组委用户发布赛事信息,参赛用户浏览赛事详情。组委填写赛事名称、举办地点、赛事时间、报名金额及赛事内容后提交发布,系统保存赛事信息并支持封面图片上传。赛事列表支持按赛事类型和举办时间进行筛选查询。赛事信息管理页面如图5-3所示。

图5-3赛事信息管理
实现赛事信息管理功能的具体步骤如下:
步骤一:前端赛事发布组件使用el-upload组件实现封面图片上传功能,上传成功后返回图片URL。表单包含赛事名称、赛事类型、举办地点、举办时间、报名金额及赛事内容等字段,使用富文本编辑器编辑赛事详情。
步骤二:后端EventInformationController接收发布请求,读取body参数构建EventInformation实体对象。调用addEntity方法保存赛事信息,同时更新收藏数、评论数和点赞数字段默认值为0。
步骤三:前端赛事列表组件在created生命周期中调用get_list接口获取赛事数据。支持传递event_name、event_type等参数实现条件筛选,后端使用QueryWrapper构建动态查询条件。
步骤四:组委在赛事管理页面调用set接口修改赛事信息,传递赛事ID与更新字段。后端根据queryMap定位记录后执行更新操作。核心代码如下:
@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();
});
EventInformation eventInformation = new EventInformation();
eventInformation.setEvent_name(paramMap.get("event_name")==null?null:String.valueOf(paramMap.get("event_name")));
eventInformation.setEvent_type(paramMap.get("event_type")==null?null:String.valueOf(paramMap.get("event_type")));
eventInformation.setEvent_location(paramMap.get("event_location")==null?null:String.valueOf(paramMap.get("event_location")));
eventInformation.setEvent_time(paramMap.get("event_time")==null?null:String.valueOf(paramMap.get("event_time")));
eventInformation.setEnrollment_amount(paramMap.get("enrollment_amount")==null?null:Double.valueOf(String.valueOf(paramMap.get("enrollment_amount"))));
eventInformation.setPraise_len(0);
eventInformation.setCollect_len(0);
eventInformation.setComment_len(0);
this.addEntity(eventInformation);
return success(1);
}
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
5.4.4 物料出入库管理实现
物料出入库管理模块支持组委用户对赛事物资进行库存管理。入库操作记录物料入库数量与入库日期,系统自动累加对应物料库存总量。出库操作记录出库数量,系统校验库存是否充足后执行库存扣减。若出库数量大于当前库存,事务回滚并返回库存不足提示。物料出入库管理页面如图5-4所示。

图5-4物料出入库管理
实现物料出入库管理功能的具体步骤如下:
步骤一:前端入库表单收集物料编号、物料名称、物料类型、入库数量及入库日期等信息。提交时调用material_receipt接口的add方法。出库表单类似,调用material_issue接口的add方法。
步骤二:MaterialReceiptController执行入库操作,保存入库记录后查询新插入记录的最大ID。执行UPDATE语句将material_inventory表中对应物料的item_quantity字段增加入库数量。
步骤三:MaterialIssueController执行出库操作,保存出库记录后查询新增记录ID。执行子查询校验物料库存数量是否充足,若库存不足则删除出库记录并返回错误信息。
步骤四:库存充足时执行UPDATE语句将物料库存数量减去出库数量,确保库存数据实时准确。核心代码如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
Map<String,Object> paramMap = service.readBody(request.getReader());
MaterialIssue materialIssue = new MaterialIssue();
materialIssue.setItem_no(paramMap.get("item_no")==null?null:String.valueOf(paramMap.get("item_no")));
materialIssue.setQuantity_of_issue(paramMap.get("quantity_of_issue")==null?null:Double.valueOf(String.valueOf(paramMap.get("quantity_of_issue"))));
this.addEntity(materialIssue);
String sql = "SELECT MAX(material_issue_id) AS max FROM material_issue";
Integer max = service.selectBaseCount(sql);
sql = ("SELECT count(*) as count FROM material_inventory INNER JOIN material_issue ON material_inventory.item_no=material_issue.item_no WHERE material_inventory.item_quantity < material_issue.quantity_of_issue AND material_issue.material_issue_id="+max);
Integer count = service.selectBaseCount(sql);
if(count > 0){
sql = "delete from material_issue WHERE material_issue_id =" + max;
service.deleteBaseSql(sql);
return error(30000, "库存不足!");
}
sql = "UPDATE material_inventory INNER JOIN material_issue ON material_inventory.item_no=material_issue.item_no SET material_inventory.item_quantity = material_inventory.item_quantity - material_issue.quantity_of_issue WHERE material_issue.material_issue_id=" + max;
service.updateBaseSql(sql);
return success(1);
}
本章小结
本章对马拉松赛事管理系统各个核心模块的实现做了详细的论述。系统开发环境采用Windows操作系统、Visual Studio Code开发平台、Node.js运行环境、Express后端框架、Vue.js前端框架及MySQL数据库。在框架搭建方面,Spring Boot项目通过Maven构建并配置application.properties文件,Vue项目通过Vue CLI创建并配置代理转发解决跨域问题。数据库连接使用mysql2驱动创建连接池,密码加密用crypto模块的MD5算法。核心业务模块有用户注册登录、报名信息管理、赛事信息管理、物料出入库管理。用户注册时对用户名唯一性进行校验,并对密码进行加密保存到Redis。报名信息提交之后会自动产生唯一的参赛号码,并且设置初始的审核状态,组委可以对审核状态进行修改。赛事信息发布支持封面图片上传、条件筛选查询。物料入库自动累计库存,物料出库校验库存是否充足,充足则扣减,不足则事务回滚返回提示。以上模块的完成为整个系统的完整功能交付打下了基础。
🎁 粉丝福利
> 感谢你看到最后!作为粉丝福利,我整理了以下资源:
> | 资源名称 | 说明 | > | 项目完整源码 | 前端 + 后端 + 数据库 |
> | 毕业论文参考 | 1.5万字完整论文 |
> | 答辩PPT模板 | 可直接修改使用 |
> | 项目演示视频 | 功能效果展示 |
> 📬 **获取方式:关注本博主 + 三连(点赞/收藏/评论)