毕设选题年年难,年年难选。如果你正在为2026年的毕业设计发愁,手里又恰好攥着一个“SSM+Vue竞赛管理APP”的题目,那这篇内容就是给你准备的。我见过太多同学卡在同一个地方——代码跑起来了,但不懂业务逻辑为什么这么设计;论文写完了,但答辩时被老师一句话问穿。所以这篇文章不讲虚的,直接把竞赛管理APP从需求拆解、数据库建模、前后端实现到论文写作的完整路线捋一遍,顺便把我踩过的坑和总结出来的经验一并交代清楚。先说结论:这个题目选得挺稳。SSM是Spring、SpringMVC、MyBatis三件套的缩写,放在2026年看虽然不算潮流前端,但胜在成熟稳定、资料多、导师认可度高;Vue负责页面交互和移动端适配,做出来的“竞赛管理APP”既能满足移动端体验,又能兼顾Web管理后台。接下来我从头到尾拆解这个项目到底怎么做。1. 竞赛管理APP的定位与核心需求拆解1.1 为什么说这是毕设里的“稳妥牌”竞赛管理系统在高校里的应用场景非常普遍,什么学科竞赛、创新创业大赛、专业技能比拼,年年都有,管起来又乱。你把这类业务做成系统,天然就有真实需求背书,答辩时老师不会质疑“你这系统有人用吗”。更重要的是,它的业务逻辑不复杂但也不算单薄——涉及用户登录注册、赛事发布、在线报名、作品提交、评委打分、成绩排名、公告通知,一套流程走下来,既有CRUD又有状态流转,还有权限区分,刚好够撑起一篇完整的毕设论文。从技术角度来看,SSM+Mysql+Vue的组合非常经典,网上的参考资料多到看不完,遇到问题搜索一下基本都有答案。这个选题不会让你在环境配置上卡太久,也不会因为技术太偏门被导师质疑工作量。相比那些动辄喊“人工智能”“区块链”的题目,这种稳扎稳打的系统开发类题目,反而更容易给答辩老师留下务实、逻辑清晰的印象。1.2 用户角色与业务场景全解析做系统之前先弄清楚“谁在用、要干什么”。竞赛管理系统通常分三类角色,我从实际场景帮你们捋清楚:管理员(赛事主办方):负责创建赛事、设置报名起止时间、审核选手报名信息、指派评委、发布公告通知、导出最终成绩与获奖名单。参赛学生(普通用户):注册登录后浏览赛事列表、查看赛事详情并在线报名、上传参赛作品或填写参赛信息、查看自己的报名状态与最终成绩。评委教师(评审角色):查看被分配评审的赛事、对参赛作品进行打分并填写评语、确认成绩提交。这三类角色的业务诉求完全不同,但他们在一条业务链上协同工作。以一场“校内程序设计大赛”为例,完整流程是这样的:管理员发布赛事信息并设置报名窗口 → 学生在APP端看到新赛事并报名 → 管理员审核报名资格 → 学生上传作品材料 → 管理员分配评委 → 评委登录打分 → 系统自动汇总排名 → 管理员导出获奖名单并发布公告。这样一个闭环流程,就把整个系统的功能模块串起来了。写需求分析的时候,按“角色—流程—功能”这个思路去写,比罗列一堆菜单名要专业得多。1.3 “APP”到底是原生还是H5?2026年最务实的方案很多人看到“APP”两个字就紧张,生怕要学Android或iOS原生开发。实际上毕设项目里的“APP”,最务实、最稳妥的做法是用Vue打造移动端H5页面,再通过打包工具封装成App壳子,或者直接用移动端浏览器访问系统。这么做有三个好处:第一,你和Web端后端共用同一套API,不需要维护两套代码;第二,Vue生态里的移动端UI库(比如Vant或NutUI)能快速做出像样的小程序风格界面;第三,答辩演示时直接在手机模拟器或浏览器里缩放展示,视觉效果完全足够。别在这个问题上过度纠结。毕设的核心是业务流程闭环,而不是App跨平台方案PK。你只需要在论文里写清楚“本系统采用前后端分离架构,前端使用Vue框架并适配移动端浏览器,用户可通过手机访问并使用全部核心功能”就可以了。2. 核心技术栈详解:SSM与Vue的分工协作2.1 后端SSM三层架构拆解SSM框架是一个“组合套餐”——Spring负责管对象、SpringMVC负责接请求、MyBatis负责操作数据库。用一个生活化的比喻:Spring是后勤部门,仓库里所有对象(Service、Mapper等)的创建和装配都归它管;SpringMVC是前台接待,所有HTTP请求先到它手里,再由它转交给合适的处理人员;MyBatis是档案管理员,应用程序想查数据、改数据,都要通过它去MySQL档案馆里操作。在工程结构上,后端代码一般分成Controller、Service、Mapper三层。Controller只做参数接收和结果返回,不写业务逻辑;Service层处理具体业务,比如报名时校验是否重复、打分后计算平均分;Mapper层负责和数据库交互,写SQL或MyBatis的XML映射。这样的分层逻辑,在论文的“系统设计”章节可以直接作为架构图素材。2.2 前端Vue如何支撑APP的交互体验竞赛管理APP的前端有两个重要场景:学生端在手机上操作,管理后台在电脑上操作。Vue框架的好处是组件化开发,同一个页面拆成多个组件复用。例如赛事卡片组件可以在“赛事列表”和“我的报名”里复用,评分表单组件可以被评审人员多次使用。数据层面的响应式特性让你不用手动操作DOM,比如用户点击“报名”按钮后,按钮状态从“可报名”变为“已报名”,这个过程Vue会帮你自动更新视图。前端项目通常配合Element UI或Vant组件库使用。管理后台用Element UI,表格、弹窗、表单一应俱全;移动端用Vant,按钮、标签、下拉刷新样式贴近APP手感。前后端通过Axios发送异步请求,接口返回JSON数据,前端渲染成用户能看懂的界面。2.3 一次完整请求的前世今生我说一个具体场景,帮大家把前后端协作的流程彻底搞懂。假设学生小李在手机APP上点击“查看赛事详情”,前端代码执行了下面这段请求:axios.get('/api/competition/detail', { params: { id: 12 } }).then(res => { this.competitionDetail = res.data.data; })这个请求会先到达后端的SpringMVC。Controller里对应的方法是:@RestController @RequestMapping("/api/competition") public class CompetitionController { @Autowired private CompetitionService competitionService; @GetMapping("/detail") public Result getDetail(@RequestParam Integer id) { Competition competition = competitionService.getDetailById(id); return Result.success(competition); } }SpringMVC把参数id=12解析出来,交给Service层。Service层调用Mapper接口,Mapper在MySQL里查记录,再把结果一层层返回给前端。前端拿到数据后,在页面上用Vue的数据绑定把赛事标题、时间、报名人数等字段填充到对应位置。这一刻你就能发现,所谓前后端分离,就是前端管“页面和交互”,后端管“数据和规则”,各司其职。3. 数据库建模:六张表撑起竞赛管理系统3.1 实体关系梳理:从业务对象到数据表数据库设计是整个系统的地基,地基没打好,后面写代码全是补丁。竞赛管理APP的核心实体有六个:用户、角色、赛事、报名记录、作品材料、评分记录。其中用户和角色是多对多关系(一个用户可能有学生和评委两种角色),但为了简化实现,推荐用“角色字段”加“用户类型”来区分,避免引入中间表增加复杂度。赛事和报名记录是1对多关系:一个赛事可以有很多人报名。报名记录和作品材料是1对1关系:一个人对一场赛事最多提交一份作品。评分记录则同时关联赛事、报名记录和评委用户。还有一个容易被忽略的实体是“公告通知”,它独立存在但关联赛事,用来发布系统消息。3.2 核心表结构设计实战我贴出最关键的三张表结构,大家可以直接照着建表。首先是用户表:CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL COMMENT '登录账号', `password` varchar(100) NOT NULL COMMENT '密码(加密存储)', `real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名', `role_type` tinyint(1) DEFAULT '0' COMMENT '角色:0学生,1评委,2管理员', `phone` varchar(20) DEFAULT NULL COMMENT '手机号', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;赛事表要注意加状态字段,用来控制业务流转:CREATE TABLE `t_competition` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(200) NOT NULL COMMENT '赛事标题', `description` text COMMENT '赛事描述', `start_time` datetime DEFAULT NULL COMMENT '报名开始时间', `end_time` datetime DEFAULT NULL COMMENT '报名截止时间', `status` tinyint(1) DEFAULT '0' COMMENT '状态:0未开始,1报名中,2评审中,3已结束', `creator_id` int(11) DEFAULT NULL COMMENT '创建人ID', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;报名表是整个系统的“流量入口”,设计时需要做防重复控制:CREATE TABLE `t_signup` ( `id` int(11) NOT NULL AUTO_INCREMENT, `competition_id` int(11) NOT NULL COMMENT '赛事ID', `user_id` int(11) NOT NULL COMMENT '报名用户ID', `team_name` varchar(100) DEFAULT NULL COMMENT '团队名称', `status` tinyint(1) DEFAULT '0' COMMENT '状态:0待审核,1通过,2拒绝', `submit_url` varchar(500) DEFAULT NULL COMMENT '作品提交地址', `score` decimal(5,2) DEFAULT NULL COMMENT '最终得分', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_comp_user` (`competition_id`, `user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;注意报名表里用唯一键uk_comp_user,这一步能从数据库层面拦住用户重复报名,比在代码里各种if判断可靠得多。这个细节写进论文里,是加分项。3.3 权限模型简化:一张角色字段搞定有同学在权限设计上加了很多表,结果把自己绕晕了。毕设项目的权限控制没必要上Spring Security那套复杂配置,用拦截器加角色判断就够了。用户登录后把用户信息和角色类型存入Session或Redis,后端在每个Controller的方法上做一个角色校验注解,管理员才能执行赛事发布、用户审核等操作,学生接口和评委接口分开即可。这一套做下来,既满足需求又容易解释,论文里写“基于RBAC思想的轻量级权限设计”完全够用。4. 项目落地全程记录:从零到可演示4.1 开发环境与工程初始化先列一个我实测下来很稳的环境版本组合,不要盲追求新版本,稳定才是硬道理:JDK 8或JDK 11(SSM项目在这两个版本下最兼容)MySQL 5.7或8.0(注意8.0需要调整驱动和连接串)Maven 3.6+Node.js 14+(Vue 2项目建议14以上即可)IDEA或Eclipse均可,前端用VS Code后端工程使用Maven构建,核心依赖在pom.xml里配置Spring、SpringMVC、MyBatis、数据库驱动和Druid连接池。前端使用Vue CLI创建项目,管理后台和移动端页面可以用同一套Vue项目通过路由区分,也可以用两套前端工程分别部署。我建议用一套前端工程,通过路由来区分页面布局,比如管理后台路由是/admin/*,学生端是/mobile/*,这样减少重复代码。4.2 核心功能模块实现笔记登录注册模块:用户通过手机号或账号注册,密码使用MD5加盐处理后存储。登录成功后生成Token,前端存在本地存储里,每次请求通过拦截器带上Token,后端校验通过才放行。这个小设计一定要写进论文,是“安全性设计”章节的重要素材。赛事发布与状态管理:管理员创建赛事后,系统根据当前时间自动判断状态——没到报名开始时间是“未开始”,在时间窗口内是“报名中”,报名截止后进入“评审中”,最终管理员手动关闭赛事变为“已结束”。可以写一个定时任务或者每次查询时动态计算状态,后者的实现更简单,适合毕设。在线报名与作品提交:学生选择赛事点击报名,后端先判断赛事状态是否为“报名中”,再判断当前用户是否已报名。成功后报名记录处于待审核状态。上传作品时,文件保存到本地服务器指定目录,数据库里记录文件路径,线上展示用iframe或者超链接打开。评委打分与排名统计:评委进入待评分列表,给每个作品打分并填写简单评语。系统对最终成绩的处理逻辑可以设计成“去掉一个最高分一个最低分后取平均”,这个算法在论文里很好写。排名统计时按平均分降序排列,管理员可以一键导出Excel文件,实现方式用POI工具包。4.3 前后端联调与数据准备联调阶段最容易出的问题有三个:跨域、接口字段对不上、本地文件路径错乱。跨域问题在Vue的vue.config.js里配置devServer代理解决,把你所有的/api请求转发到后端localhost:8080。接口字段对不上,用浏览器的Network面板逐个检查请求和响应。文件上传路径一定要用绝对磁盘路径存配置项,别写死在代码里。演示前的数据准备我特别提醒一下:不要用空数据演示,提前创建几个账号、录入三到五个赛事、让一个评委完成部分打分。这样现场演示的时候,打开页面就有丰富的内容,老师能看到系统各状态下的真实效果。5. 论文写作:程序决定你能不能毕业,论文决定你拿什么等级5.1 论文各章节内容分配与写作顺序论文框架网上模板一大堆,但很多人不知道各章节怎么写才能不啰嗦又不空洞。我先给一个建议的字数和内容安排:摘要与绪论(约1000字):摘要写清楚做了什么、用了什么技术、达到了什么效果,不要写废话;绪论写开题背景和研究意义,加一点国内外现状综述。需求分析(约1500字):画出用户角色图、业务流程图、用例图,再写功能需求和非功能需求,把三类角色的功能点列全。系统设计(约2000字):包括系统架构设计、功能模块设计、数据库设计。数据库部分把表结构贴出来,配合E-R图说明关系。系统实现(约2000字):按功能模块逐一说明实现思路,配核心代码截图和运行效果截图。截图不要太多,挑代表性页面即可。系统测试(约800字):列功能测试用例表,写出测试步骤、预期结果、实际结果。再补一段性能测试简述,说明响应时间满足要求即可。写作顺序建议先写系统设计和数据库设计,再写实现和测试,最后补摘要和绪论,避免卡在第一章。5.2 三张图搞定导师印象分导师看论文通常先看图。必画的三个图是:系统架构图(展现前后端分离和分层架构)、系统用例图(展现三个角色和功能权限)、数据库E-R图(展现实体关系)。这三张图画清楚,学术水平立刻上了一个档次。工具用Visio或Draw.io都行,画完导出高清图插入Word。另外推荐画一张业务流程图,把“发布赛事→报名→评审→排名→公布”的完整流程可视化,评审老师看了会觉得条理清晰。5.3 测试章节别只会写“功能正常”很多同学的测试章节就是“登录功能测试——正常”“报名功能测试——通过”,这样太单薄。至少有这三个维度:功能测试用例:在表格里写用例编号、测试项、前置条件、输入数据、预期结果、实际结果。比如“重复报名拦截”这条用例:先报名赛事A,再点击报名,预期提示‘已报名’,实际结果通过。兼容性测试:分别用Chrome、Edge、手机浏览器访问系统,记录页面显示是否正常。安全测试:写非法访问拦截、未登录跳转登录页、SQL注入防护等测试结果。这样一来,系统的完成度就能在文字层面体现出来,答辩时也能给老师留下“做过完整测试”的印象。6. 毕设排雷手册与答辩技巧6.1 时间规划:程序与论文并行推进我见过太多人前松后紧,最后半个月通宵赶工。正确做法是提前十二周开始,把任务拆解到周。前两周搭环境和框架,让项目能跑起来;第三周到第七周实现核心功能,从登录、赛事管理到报名和评分;第八周开始同步写论文,白天改程序、晚上写论文;第九周到第十周完成全部功能测试和论文初稿;最后两周集中处理查重、格式和答辩PPT。程序与论文一定要并行,不要等代码全写完再动笔,否则论文很容易写成流水账,缺少设计思路的描述。6.2 常见问题排查速查表我把实操中高频问题整理成了表格,遇到直接照方抓药:问题现象可能原因解决方案Maven依赖下载失败网络源不稳定在settings.xml中配置阿里云镜像数据库中文乱码连接串缺字符编码参数在JDBC连接串上加characterEncoding=utf8前端请求后端接口报404接口路径写错或端口不一致检查后端路由注解和前端请求路径文件上传后访问404路径映射未配置使用WebMvcConfigurer配置虚拟路径映射Vue项目打包后接口失效后端地址被写死为localhost使用环境变量配置API基础地址端口被占用上一次运行未退出命令行执行netstat -ano查占用并结束进程答辩现场演示网络卡顿后端服务未启动提前把服务全部启动并开启备用热点6.3 答辩演示的“表演方法论”答辩本质上是一场演示,不是读PPT。你只有十几分钟,必须抓住重点。我的建议是三段式演示:第一段(2分钟):从系统首页进入,展示赛事列表和公告,让老师看到系统全貌,边操作边说业务场景。第二段(5分钟):完整跑一遍核心流程。现场创建一个测试账号,报名一个赛事,切换到管理员视角审核,再以评委身份打分,最后看排名结果。这段是重中之重,一定提前演练三遍以上。第三段(1分钟):展示一个亮点功能,比如Excel成绩导出、自动按赛事状态过滤展示、前后端分离架构图。选你最熟悉的一个点深入讲,别贪多。被老师提问的时候,记住一个原则:会的问题答完再补一句设计思路;不会的问题如实说“目前没有深入实现,后续可以考虑扩展”,不要胡编。老师其实是愿意给你过,只要你的系统和论文是完整闭环,态度诚恳,答辩没过的人真的很少。7. 写在最后的一点私人心得做了这么多年开发和毕设辅导,我最大的体会是:毕设这个东西,难点从来不在技术有多深,而在你能不能把一件“看起来简单”的事情完整闭环地做出来。竞赛管理APP这种系统,三天能跑通demo,但要把登录态、状态流转、角色权限、异常分支都处理好,把论文里的每一张图、每一个表都写得对得上代码,需要实打实的功夫。如果你现在准备动手,我的建议是先把数据库表建好,再让一个核心流程从头到尾跑通,剩下的模块就全是复制这个模式的体力活。最后再提醒一句:代码可以借助参考,但论文和答辩必须是你自己嚼烂了的知识。祝顺利。
毕设选题年年难,年年难选。如果你正在为2026年的毕业设计发愁,手里又恰好攥着一个“SSM+Vue竞赛管理APP”的题目,那这篇内容就是给你准备的。我见过太多同学卡在同一个地方——代码跑起来了,但不懂业务逻辑为什么这么设计;论文写完了,但答辩时被老师一句话问穿。所以这篇文章不讲虚的,直接把竞赛管理APP从需求拆解、数据库建模、前后端实现到论文写作的完整路线捋一遍,顺便把我踩过的坑和总结出来的经验一并交代清楚。先说结论:这个题目选得挺稳。SSM是Spring、SpringMVC、MyBatis三件套的缩写,放在2026年看虽然不算潮流前端,但胜在成熟稳定、资料多、导师认可度高;Vue负责页面交互和移动端适配,做出来的“竞赛管理APP”既能满足移动端体验,又能兼顾Web管理后台。接下来我从头到尾拆解这个项目到底怎么做。1. 竞赛管理APP的定位与核心需求拆解1.1 为什么说这是毕设里的“稳妥牌”竞赛管理系统在高校里的应用场景非常普遍,什么学科竞赛、创新创业大赛、专业技能比拼,年年都有,管起来又乱。你把这类业务做成系统,天然就有真实需求背书,答辩时老师不会质疑“你这系统有人用吗”。更重要的是,它的业务逻辑不复杂但也不算单薄——涉及用户登录注册、赛事发布、在线报名、作品提交、评委打分、成绩排名、公告通知,一套流程走下来,既有CRUD又有状态流转,还有权限区分,刚好够撑起一篇完整的毕设论文。从技术角度来看,SSM+Mysql+Vue的组合非常经典,网上的参考资料多到看不完,遇到问题搜索一下基本都有答案。这个选题不会让你在环境配置上卡太久,也不会因为技术太偏门被导师质疑工作量。相比那些动辄喊“人工智能”“区块链”的题目,这种稳扎稳打的系统开发类题目,反而更容易给答辩老师留下务实、逻辑清晰的印象。1.2 用户角色与业务场景全解析做系统之前先弄清楚“谁在用、要干什么”。竞赛管理系统通常分三类角色,我从实际场景帮你们捋清楚:管理员(赛事主办方):负责创建赛事、设置报名起止时间、审核选手报名信息、指派评委、发布公告通知、导出最终成绩与获奖名单。参赛学生(普通用户):注册登录后浏览赛事列表、查看赛事详情并在线报名、上传参赛作品或填写参赛信息、查看自己的报名状态与最终成绩。评委教师(评审角色):查看被分配评审的赛事、对参赛作品进行打分并填写评语、确认成绩提交。这三类角色的业务诉求完全不同,但他们在一条业务链上协同工作。以一场“校内程序设计大赛”为例,完整流程是这样的:管理员发布赛事信息并设置报名窗口 → 学生在APP端看到新赛事并报名 → 管理员审核报名资格 → 学生上传作品材料 → 管理员分配评委 → 评委登录打分 → 系统自动汇总排名 → 管理员导出获奖名单并发布公告。这样一个闭环流程,就把整个系统的功能模块串起来了。写需求分析的时候,按“角色—流程—功能”这个思路去写,比罗列一堆菜单名要专业得多。1.3 “APP”到底是原生还是H5?2026年最务实的方案很多人看到“APP”两个字就紧张,生怕要学Android或iOS原生开发。实际上毕设项目里的“APP”,最务实、最稳妥的做法是用Vue打造移动端H5页面,再通过打包工具封装成App壳子,或者直接用移动端浏览器访问系统。这么做有三个好处:第一,你和Web端后端共用同一套API,不需要维护两套代码;第二,Vue生态里的移动端UI库(比如Vant或NutUI)能快速做出像样的小程序风格界面;第三,答辩演示时直接在手机模拟器或浏览器里缩放展示,视觉效果完全足够。别在这个问题上过度纠结。毕设的核心是业务流程闭环,而不是App跨平台方案PK。你只需要在论文里写清楚“本系统采用前后端分离架构,前端使用Vue框架并适配移动端浏览器,用户可通过手机访问并使用全部核心功能”就可以了。2. 核心技术栈详解:SSM与Vue的分工协作2.1 后端SSM三层架构拆解SSM框架是一个“组合套餐”——Spring负责管对象、SpringMVC负责接请求、MyBatis负责操作数据库。用一个生活化的比喻:Spring是后勤部门,仓库里所有对象(Service、Mapper等)的创建和装配都归它管;SpringMVC是前台接待,所有HTTP请求先到它手里,再由它转交给合适的处理人员;MyBatis是档案管理员,应用程序想查数据、改数据,都要通过它去MySQL档案馆里操作。在工程结构上,后端代码一般分成Controller、Service、Mapper三层。Controller只做参数接收和结果返回,不写业务逻辑;Service层处理具体业务,比如报名时校验是否重复、打分后计算平均分;Mapper层负责和数据库交互,写SQL或MyBatis的XML映射。这样的分层逻辑,在论文的“系统设计”章节可以直接作为架构图素材。2.2 前端Vue如何支撑APP的交互体验竞赛管理APP的前端有两个重要场景:学生端在手机上操作,管理后台在电脑上操作。Vue框架的好处是组件化开发,同一个页面拆成多个组件复用。例如赛事卡片组件可以在“赛事列表”和“我的报名”里复用,评分表单组件可以被评审人员多次使用。数据层面的响应式特性让你不用手动操作DOM,比如用户点击“报名”按钮后,按钮状态从“可报名”变为“已报名”,这个过程Vue会帮你自动更新视图。前端项目通常配合Element UI或Vant组件库使用。管理后台用Element UI,表格、弹窗、表单一应俱全;移动端用Vant,按钮、标签、下拉刷新样式贴近APP手感。前后端通过Axios发送异步请求,接口返回JSON数据,前端渲染成用户能看懂的界面。2.3 一次完整请求的前世今生我说一个具体场景,帮大家把前后端协作的流程彻底搞懂。假设学生小李在手机APP上点击“查看赛事详情”,前端代码执行了下面这段请求:axios.get('/api/competition/detail', { params: { id: 12 } }).then(res => { this.competitionDetail = res.data.data; })这个请求会先到达后端的SpringMVC。Controller里对应的方法是:@RestController @RequestMapping("/api/competition") public class CompetitionController { @Autowired private CompetitionService competitionService; @GetMapping("/detail") public Result getDetail(@RequestParam Integer id) { Competition competition = competitionService.getDetailById(id); return Result.success(competition); } }SpringMVC把参数id=12解析出来,交给Service层。Service层调用Mapper接口,Mapper在MySQL里查记录,再把结果一层层返回给前端。前端拿到数据后,在页面上用Vue的数据绑定把赛事标题、时间、报名人数等字段填充到对应位置。这一刻你就能发现,所谓前后端分离,就是前端管“页面和交互”,后端管“数据和规则”,各司其职。3. 数据库建模:六张表撑起竞赛管理系统3.1 实体关系梳理:从业务对象到数据表数据库设计是整个系统的地基,地基没打好,后面写代码全是补丁。竞赛管理APP的核心实体有六个:用户、角色、赛事、报名记录、作品材料、评分记录。其中用户和角色是多对多关系(一个用户可能有学生和评委两种角色),但为了简化实现,推荐用“角色字段”加“用户类型”来区分,避免引入中间表增加复杂度。赛事和报名记录是1对多关系:一个赛事可以有很多人报名。报名记录和作品材料是1对1关系:一个人对一场赛事最多提交一份作品。评分记录则同时关联赛事、报名记录和评委用户。还有一个容易被忽略的实体是“公告通知”,它独立存在但关联赛事,用来发布系统消息。3.2 核心表结构设计实战我贴出最关键的三张表结构,大家可以直接照着建表。首先是用户表:CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL COMMENT '登录账号', `password` varchar(100) NOT NULL COMMENT '密码(加密存储)', `real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名', `role_type` tinyint(1) DEFAULT '0' COMMENT '角色:0学生,1评委,2管理员', `phone` varchar(20) DEFAULT NULL COMMENT '手机号', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;赛事表要注意加状态字段,用来控制业务流转:CREATE TABLE `t_competition` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(200) NOT NULL COMMENT '赛事标题', `description` text COMMENT '赛事描述', `start_time` datetime DEFAULT NULL COMMENT '报名开始时间', `end_time` datetime DEFAULT NULL COMMENT '报名截止时间', `status` tinyint(1) DEFAULT '0' COMMENT '状态:0未开始,1报名中,2评审中,3已结束', `creator_id` int(11) DEFAULT NULL COMMENT '创建人ID', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;报名表是整个系统的“流量入口”,设计时需要做防重复控制:CREATE TABLE `t_signup` ( `id` int(11) NOT NULL AUTO_INCREMENT, `competition_id` int(11) NOT NULL COMMENT '赛事ID', `user_id` int(11) NOT NULL COMMENT '报名用户ID', `team_name` varchar(100) DEFAULT NULL COMMENT '团队名称', `status` tinyint(1) DEFAULT '0' COMMENT '状态:0待审核,1通过,2拒绝', `submit_url` varchar(500) DEFAULT NULL COMMENT '作品提交地址', `score` decimal(5,2) DEFAULT NULL COMMENT '最终得分', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_comp_user` (`competition_id`, `user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;注意报名表里用唯一键uk_comp_user,这一步能从数据库层面拦住用户重复报名,比在代码里各种if判断可靠得多。这个细节写进论文里,是加分项。3.3 权限模型简化:一张角色字段搞定有同学在权限设计上加了很多表,结果把自己绕晕了。毕设项目的权限控制没必要上Spring Security那套复杂配置,用拦截器加角色判断就够了。用户登录后把用户信息和角色类型存入Session或Redis,后端在每个Controller的方法上做一个角色校验注解,管理员才能执行赛事发布、用户审核等操作,学生接口和评委接口分开即可。这一套做下来,既满足需求又容易解释,论文里写“基于RBAC思想的轻量级权限设计”完全够用。4. 项目落地全程记录:从零到可演示4.1 开发环境与工程初始化先列一个我实测下来很稳的环境版本组合,不要盲追求新版本,稳定才是硬道理:JDK 8或JDK 11(SSM项目在这两个版本下最兼容)MySQL 5.7或8.0(注意8.0需要调整驱动和连接串)Maven 3.6+Node.js 14+(Vue 2项目建议14以上即可)IDEA或Eclipse均可,前端用VS Code后端工程使用Maven构建,核心依赖在pom.xml里配置Spring、SpringMVC、MyBatis、数据库驱动和Druid连接池。前端使用Vue CLI创建项目,管理后台和移动端页面可以用同一套Vue项目通过路由区分,也可以用两套前端工程分别部署。我建议用一套前端工程,通过路由来区分页面布局,比如管理后台路由是/admin/*,学生端是/mobile/*,这样减少重复代码。4.2 核心功能模块实现笔记登录注册模块:用户通过手机号或账号注册,密码使用MD5加盐处理后存储。登录成功后生成Token,前端存在本地存储里,每次请求通过拦截器带上Token,后端校验通过才放行。这个小设计一定要写进论文,是“安全性设计”章节的重要素材。赛事发布与状态管理:管理员创建赛事后,系统根据当前时间自动判断状态——没到报名开始时间是“未开始”,在时间窗口内是“报名中”,报名截止后进入“评审中”,最终管理员手动关闭赛事变为“已结束”。可以写一个定时任务或者每次查询时动态计算状态,后者的实现更简单,适合毕设。在线报名与作品提交:学生选择赛事点击报名,后端先判断赛事状态是否为“报名中”,再判断当前用户是否已报名。成功后报名记录处于待审核状态。上传作品时,文件保存到本地服务器指定目录,数据库里记录文件路径,线上展示用iframe或者超链接打开。评委打分与排名统计:评委进入待评分列表,给每个作品打分并填写简单评语。系统对最终成绩的处理逻辑可以设计成“去掉一个最高分一个最低分后取平均”,这个算法在论文里很好写。排名统计时按平均分降序排列,管理员可以一键导出Excel文件,实现方式用POI工具包。4.3 前后端联调与数据准备联调阶段最容易出的问题有三个:跨域、接口字段对不上、本地文件路径错乱。跨域问题在Vue的vue.config.js里配置devServer代理解决,把你所有的/api请求转发到后端localhost:8080。接口字段对不上,用浏览器的Network面板逐个检查请求和响应。文件上传路径一定要用绝对磁盘路径存配置项,别写死在代码里。演示前的数据准备我特别提醒一下:不要用空数据演示,提前创建几个账号、录入三到五个赛事、让一个评委完成部分打分。这样现场演示的时候,打开页面就有丰富的内容,老师能看到系统各状态下的真实效果。5. 论文写作:程序决定你能不能毕业,论文决定你拿什么等级5.1 论文各章节内容分配与写作顺序论文框架网上模板一大堆,但很多人不知道各章节怎么写才能不啰嗦又不空洞。我先给一个建议的字数和内容安排:摘要与绪论(约1000字):摘要写清楚做了什么、用了什么技术、达到了什么效果,不要写废话;绪论写开题背景和研究意义,加一点国内外现状综述。需求分析(约1500字):画出用户角色图、业务流程图、用例图,再写功能需求和非功能需求,把三类角色的功能点列全。系统设计(约2000字):包括系统架构设计、功能模块设计、数据库设计。数据库部分把表结构贴出来,配合E-R图说明关系。系统实现(约2000字):按功能模块逐一说明实现思路,配核心代码截图和运行效果截图。截图不要太多,挑代表性页面即可。系统测试(约800字):列功能测试用例表,写出测试步骤、预期结果、实际结果。再补一段性能测试简述,说明响应时间满足要求即可。写作顺序建议先写系统设计和数据库设计,再写实现和测试,最后补摘要和绪论,避免卡在第一章。5.2 三张图搞定导师印象分导师看论文通常先看图。必画的三个图是:系统架构图(展现前后端分离和分层架构)、系统用例图(展现三个角色和功能权限)、数据库E-R图(展现实体关系)。这三张图画清楚,学术水平立刻上了一个档次。工具用Visio或Draw.io都行,画完导出高清图插入Word。另外推荐画一张业务流程图,把“发布赛事→报名→评审→排名→公布”的完整流程可视化,评审老师看了会觉得条理清晰。5.3 测试章节别只会写“功能正常”很多同学的测试章节就是“登录功能测试——正常”“报名功能测试——通过”,这样太单薄。至少有这三个维度:功能测试用例:在表格里写用例编号、测试项、前置条件、输入数据、预期结果、实际结果。比如“重复报名拦截”这条用例:先报名赛事A,再点击报名,预期提示‘已报名’,实际结果通过。兼容性测试:分别用Chrome、Edge、手机浏览器访问系统,记录页面显示是否正常。安全测试:写非法访问拦截、未登录跳转登录页、SQL注入防护等测试结果。这样一来,系统的完成度就能在文字层面体现出来,答辩时也能给老师留下“做过完整测试”的印象。6. 毕设排雷手册与答辩技巧6.1 时间规划:程序与论文并行推进我见过太多人前松后紧,最后半个月通宵赶工。正确做法是提前十二周开始,把任务拆解到周。前两周搭环境和框架,让项目能跑起来;第三周到第七周实现核心功能,从登录、赛事管理到报名和评分;第八周开始同步写论文,白天改程序、晚上写论文;第九周到第十周完成全部功能测试和论文初稿;最后两周集中处理查重、格式和答辩PPT。程序与论文一定要并行,不要等代码全写完再动笔,否则论文很容易写成流水账,缺少设计思路的描述。6.2 常见问题排查速查表我把实操中高频问题整理成了表格,遇到直接照方抓药:问题现象可能原因解决方案Maven依赖下载失败网络源不稳定在settings.xml中配置阿里云镜像数据库中文乱码连接串缺字符编码参数在JDBC连接串上加characterEncoding=utf8前端请求后端接口报404接口路径写错或端口不一致检查后端路由注解和前端请求路径文件上传后访问404路径映射未配置使用WebMvcConfigurer配置虚拟路径映射Vue项目打包后接口失效后端地址被写死为localhost使用环境变量配置API基础地址端口被占用上一次运行未退出命令行执行netstat -ano查占用并结束进程答辩现场演示网络卡顿后端服务未启动提前把服务全部启动并开启备用热点6.3 答辩演示的“表演方法论”答辩本质上是一场演示,不是读PPT。你只有十几分钟,必须抓住重点。我的建议是三段式演示:第一段(2分钟):从系统首页进入,展示赛事列表和公告,让老师看到系统全貌,边操作边说业务场景。第二段(5分钟):完整跑一遍核心流程。现场创建一个测试账号,报名一个赛事,切换到管理员视角审核,再以评委身份打分,最后看排名结果。这段是重中之重,一定提前演练三遍以上。第三段(1分钟):展示一个亮点功能,比如Excel成绩导出、自动按赛事状态过滤展示、前后端分离架构图。选你最熟悉的一个点深入讲,别贪多。被老师提问的时候,记住一个原则:会的问题答完再补一句设计思路;不会的问题如实说“目前没有深入实现,后续可以考虑扩展”,不要胡编。老师其实是愿意给你过,只要你的系统和论文是完整闭环,态度诚恳,答辩没过的人真的很少。7. 写在最后的一点私人心得做了这么多年开发和毕设辅导,我最大的体会是:毕设这个东西,难点从来不在技术有多深,而在你能不能把一件“看起来简单”的事情完整闭环地做出来。竞赛管理APP这种系统,三天能跑通demo,但要把登录态、状态流转、角色权限、异常分支都处理好,把论文里的每一张图、每一个表都写得对得上代码,需要实打实的功夫。如果你现在准备动手,我的建议是先把数据库表建好,再让一个核心流程从头到尾跑通,剩下的模块就全是复制这个模式的体力活。最后再提醒一句:代码可以借助参考,但论文和答辩必须是你自己嚼烂了的知识。祝顺利。