
简介这份资源面向计算机相关专业的毕业生与Java初学者提供一套基于微信小程序的大学生科技竞赛管理系统完整实现方案帮助解决毕业设计选题、框架搭建与前后端联调等实际问题。项目采用Spring Boot构建后台服务管理端页面使用Vue小程序端覆盖学生注册、在线报名、查询成绩、收藏管理等功能后台则包含主办方管理、竞赛分类与信息管理、公告栏管理、报名与成绩管理等模块数据库为MySQL兼容JDK1.8及Eclipse、IDEA等常用开发工具。压缩包共1338个文件约77.3MB涵盖Java源码、Vue组件、微信小程序wxml与wxss页面、js脚本、json配置、png与svg图片素材以及sql数据库脚本、doc论文与说明文档、bat启动脚本等目录结构清晰。资源还附带论文、开题报告、环境工具包与同框架项目安装教程便于读者快速理解业务逻辑、复用代码并完成部署调试。目前已有132人学习适合需要完整赛题方案与文档支撑的毕业设计场景。1. 竞赛管理系统从报名到成绩一个小程序如何串起三方角色每年到了学科竞赛季最头疼的往往不是比赛本身而是报名表在群里刷屏、成绩靠 Excel 传来传去、主办方追着学生确认信息。这套基于微信小程序的大学生科技竞赛管理系统就是冲着这个场景去的学生端在小程序里注册、在线报名、查成绩、收藏竞赛主办方端管竞赛、审报名、录成绩管理员端管分类、公告、用户和系统配置。后台用 Spring Boot 提供接口管理页面用 Vue 搭数据落 MySQLJDK 1.8 就能跑Eclipse、MyEclipse、STS、IDEA 都能导入。它适合拿来做毕业设计也适合想练手「小程序 Spring Boot 前后端分离」这套组合的开发者。下面我按「能干什么 → 怎么跑起来 → 核心代码怎么改」的顺序把这份源码拆开讲。2. 技术栈与目录结构先看清这套前后端分离的骨架2.1 后端 Spring Boot 的分层与依赖后端是标准的 Spring Boot 结构入口类带SpringBootApplication下面按 controller、service、mapper、entity 分层。数据库访问用 MyBatis-Plus 或原生 MyBatis这类毕设项目常见做法是 MyBatis-Plus省掉大量 XML分页、条件查询都能少写不少代码。pom.xml里核心依赖大致是这几块!-- Spring Boot Web提供 REST 接口 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MyBatis-Plus简化单表 CRUD -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.2/version /dependency !-- MySQL 驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId /dependency参数说明spring-boot-starter-web负责把RestController暴露成 HTTP 接口MyBatis-Plus 的BaseMapper让每个 Mapper 白拿增删改查MySQL 驱动版本要和本地 MySQL 对齐8.x 的库用 8.x 驱动否则会报时区或 SSL 连接错误。改依赖时优先动版本号别乱删 starter删了会连锁报ClassNotFoundException。2.2 前端 Vue 管理后台与小程序端的目录管理后台是 Vue 项目src/views下按业务分目录比如竞赛信息、报名管理、成绩管理各一个文件夹src/api里放 axios 请求封装src/router配路由。小程序端则是原生微信小程序结构pages下按学生端功能分页注册登录、竞赛列表、在线报名、成绩查询、个人中心。项目正文里那串.bak文件main.css.bak、update-password.vue.bak、IndexMain.vue.bak等是备份文件说明作者改版时留了后手你二次开发前也可以照这个习惯先备份再动。# 典型目录以实际解压为准 springboot-backend/ # 后端 src/main/java/com/xxx/ controller/ # 接口层 service/ # 业务层 mapper/ # 数据访问 entity/ # 实体类 src/main/resources/ application.yml # 数据库、端口配置 vue-admin/ # Vue 管理后台 src/views/ # 页面 src/api/ # 请求封装 wx-miniprogram/ # 微信小程序 pages/ # 学生端页面 sql/ # 数据库脚本提示解压后先别急着改代码先把三个端的目录各扫一遍确认哪个文件夹是后端、哪个是后台、哪个是小程序后面配置路径才不会串。2.3 数据库脚本与核心表关系sql目录里的脚本导入后会生成用户表、竞赛分类表、竞赛信息表、报名表、成绩表、公告表、收藏表等。核心关系是一个分类下挂多个竞赛一个竞赛对应多条报名记录一条报名记录对应一条成绩。理解这条链路后面改「报名审核」或「成绩录入」时就知道该动哪张表。-- 报名表核心字段示意以实际脚本为准 CREATE TABLE competition_signup ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT COMMENT 学生用户ID, competition_id BIGINT COMMENT 竞赛ID, status TINYINT COMMENT 0待审 1通过 2驳回, create_time DATETIME );参数说明status是报名审核的状态位前端筛选「待审核」就是查status0user_id和competition_id是两条外键线索联表查询时靠它们把学生和竞赛信息拼起来。改状态流转时记得同步改前端按钮的显示条件否则会出现「已通过还能再点通过」的尴尬。3. 跑起来从导入数据库到三端联调的完整步骤3.1 环境准备与数据库导入先把 JDK 1.8、Maven、MySQL、Node.js 装好微信开发者工具也备上。数据库用 Navicat 或命令行导入sql脚本建库时字符集选utf8mb4不然公告里的特殊符号会变问号。# 命令行导入示例 mysql -u root -p CREATE DATABASE competition_db DEFAULT CHARSET utf8mb4; USE competition_db; SOURCE /你的路径/sql/competition_db.sql;参数说明utf8mb4比utf8多支持 emoji 和部分生僻字公告栏里学生爱发符号用utf8mb4少踩坑。导入后执行SHOW TABLES;确认表都建出来了缺表多半是脚本没跑完或中途报错。3.2 后端配置与启动打开application.yml把数据库地址、账号、密码改成你本地的端口默认 8080被占用就换。server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/competition_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 你的密码 driver-class-name: com.mysql.cj.jdbc.Driver参数说明serverTimezoneAsia/Shanghai是 MySQL 8 的常见必需项不写会报时区异常characterEncodingutf8保证中文不乱码。改完在 IDEA 里右键入口类 Run控制台出现Started ...Application就算起来了。启动失败先看报错第一行是连不上库还是端口冲突别被后面几十行堆栈带偏。3.3 Vue 后台与小程序端启动Vue 后台进目录后先装依赖再跑cd vue-admin npm install # 或 cnpm install网络慢时换源 npm run serve # 启动开发服务器参数说明npm install拉依赖卡住多半是网络问题换国内镜像源即可npm run serve起本地服务控制台会给一个http://localhost:xxxx地址浏览器打开就是管理后台登录页。小程序端用微信开发者工具「导入项目」选wx-miniprogram目录填上自己的 AppID没有就用测试号再把小程序里请求后端的 baseUrl 改成http://localhost:8080。真机调试时 localhost 不通需要换成局域网 IP这是新手最容易卡住的一步。3.4 三端联调与账号验证后端、后台、小程序都起来后先用管理员账号登后台建一个竞赛分类再发一条竞赛信息然后小程序端注册学生账号看能不能刷到这条竞赛并报名最后回后台审核报名、录成绩小程序端查成绩。这条链路走通说明三端接口对上了。注意如果小程序请求报「不在以下 request 合法域名列表」是开发者工具没勾「不校验合法域名」在详情设置里勾上即可上线前再配正式域名。4. 核心模块拆解报名、成绩、权限三条主线的代码实现4.1 在线报名接口与状态流转报名是学生端的核心动作后端接口大致长这样PostMapping(/signup/add) public Result addSignup(RequestBody SignupDTO dto) { // 1. 校验是否重复报名同一竞赛 Long count signupService.count(new QueryWrapperSignup() .eq(user_id, dto.getUserId()) .eq(competition_id, dto.getCompetitionId())); if (count 0) { return Result.fail(你已报名该竞赛); } // 2. 落库初始状态为待审核 Signup signup new Signup(); signup.setUserId(dto.getUserId()); signup.setCompetitionId(dto.getCompetitionId()); signup.setStatus(0); signup.setCreateTime(new Date()); signupService.save(signup); return Result.ok(报名成功等待审核); }逻辑说明先查重再落库避免同一学生重复报名status0表示待审核后续主办方审核时改成 1 或 2。参数说明SignupDTO只接userId和competitionId别把整个实体丢进来防止前端篡改状态字段。改这块时如果要加「报名截止时间」校验就在查重前先查竞赛的截止时间超时直接返回失败。4.2 成绩录入与查询成绩由主办方录入学生端只读。录入接口PostMapping(/score/save) public Result saveScore(RequestBody Score score) { // 一条报名记录对应一条成绩存在则更新 Score exist scoreService.getOne(new QueryWrapperScore() .eq(signup_id, score.getSignupId())); if (exist ! null) { score.setId(exist.getId()); scoreService.updateById(score); } else { scoreService.save(score); } return Result.ok(成绩已保存); }逻辑说明用signup_id判断成绩是否已存在存在就更新不存在就新增避免同一报名出现多条成绩。参数说明signupId是关联报名的关键字段前端传成绩时务必带上。学生端查询成绩时按当前登录用户的userId联表查出对应成绩别直接暴露全表查询接口。4.3 角色权限学生、主办方、管理员的分流系统有三类角色登录后返回的角色标识决定进哪个端。常见做法是在登录接口里返回role字段前端据此跳转后端接口再用拦截器校验。// 登录成功后返回角色 MapString, Object data new HashMap(); data.put(token, token); data.put(role, user.getRole()); // student / organizer / admin return Result.ok(data);参数说明role取值建议用英文常量别用中文避免编码问题。后端拦截器里按接口路径前缀判断角色比如/admin/**只放行 admin/organizer/**放行 organizer 和 admin。改权限时前端隐藏按钮只是体验真正的拦截必须在后端做否则接口能被直接调用。4.4 公告与收藏模块公告由管理员发布学生端首页展示收藏是学生把感兴趣的竞赛存起来。这两个模块逻辑简单但要注意公告的富文本内容存库时别被截断字段类型用TEXT而不是VARCHAR(255)。收藏表用user_id competition_id做唯一约束防止重复收藏。5. 避坑与排查跑这套源码最容易翻车的几个点5.1 数据库连不上或中文乱码现象后端启动报Access denied或公告显示问号。原因账号密码不对或建库时字符集不是utf8mb4。解决核对application.yml里的账号密码重建库时指定DEFAULT CHARSET utf8mb4连接串加characterEncodingutf8。5.2 小程序请求后端失败现象小程序端列表空白控制台报请求错误。原因baseUrl 还指向示例地址或开发者工具没勾「不校验合法域名」。解决把 baseUrl 改成你本机后端地址真机调试换成局域网 IP开发阶段勾上不校验域名。5.3 端口冲突导致启动失败现象后端报Port 8080 was already in use。原因8080 被别的程序占了。解决改application.yml里的server.port或关掉占用端口的进程。改端口后记得同步改前端请求地址。5.4 依赖下载慢或失败现象npm install或 Maven 拉包卡住。原因默认源网络不稳。解决npm 换国内镜像源Maven 在settings.xml里配国内仓库镜像。这一步纯属环境问题和代码无关别怀疑项目本身。5.5 角色登录后跳错端现象管理员登录却进了学生端页面。原因前端角色判断逻辑写死或字段没对上。解决检查登录返回的role字段和前端判断条件是否一致后端返回英文常量前端按常量分流。6. 二次开发把竞赛管理系统改成你自己的项目拿到这套源码最值的改造方向是把它变成你熟悉的业务。比如把「科技竞赛」换成「社团活动」或「课程设计选题」核心链路不变只改表名、字段和页面文案。具体做法先改数据库表名和实体类再改 Mapper 和 Service 里的字段引用最后改前端页面标题和表单字段。改的时候用全局搜索替换但要注意别把user_id这种通用字段也误改。第二个方向是加功能。比如加「竞赛报名人数统计」在后台加一个统计接口用GROUP BY competition_id查出每个竞赛的报名数前端用图表展示。或者加「消息通知」报名审核通过后给学生发一条站内消息。这些都能在现有分层里加不用动架构。第三个方向是优化体验。小程序端可以加下拉刷新和分页加载避免一次拉全量数据后台列表加搜索和筛选按竞赛名称、状态过滤。这些改动集中在 controller 的查询条件和前端组件风险低、见效快。验证改造是否成功我一般会走一遍完整链路注册新学生 → 报名 → 后台审核 → 录成绩 → 学生查成绩每一步都确认数据落库正确、页面显示正确。这套流程走通基本就说明你的改动没破坏主链路。提示改之前先把原始代码打包备份一份尤其是那串.bak文件对应的原文件改崩了还能退回去。从那以后我每次接手这类毕设源码都强制先跑通原始版本再动一行代码确认环境没问题、链路能走通再开始改。这样出问题时能快速判断是环境问题还是自己改出来的问题。希望帮到你。本文还有配套的精品资源点击获取