考试报名系统的设计与实现(SpringBoot + MySQL + Vue 三角色平台)
一套覆盖「教师发布考试 → 学生在线报名 → 系统生成准考证 → 教师录入成绩」全链路的在线考试报名平台,同时支持学生、教师、管理员三套账号体系。
目录
一、项目概述 二、技术架构 三、数据库设计 四、三套用户体系 五、核心业务流程 六、配置与部署 七、项目亮点 八、技术栈总览 九、适合谁用 十、结语
一、项目概述
考试报名系统的设计与实现,是一套基于 SpringBoot + MySQL + Vue 的前后端分离 Web 应用。它要解决的是高校里最常见也最琐碎的一类事务:考试报名。
线下流程通常是:教务处排考 → 教师在群里发报名通知 → 学生用手机号发短信报名 → 教务处人工汇总名单 → 导成 Excel → 再人工分配考场和准考证号。整个流程跨越四五个环节,任何一环漏了都要重新核对。
这套系统把它搬到了线上:
- 教师发布考试信息(科目、考试时间、考点、报名费用、注意事项),审核学生报名申请;
- 学生浏览考试列表、提交报名、上传准考证、查看自己的成绩;
- 管理员管理公告、资讯、论坛和系统配置。
源码共 121 个 Java 文件、12847 行代码 ,拆出 14 个 Controller、140 个 REST 端点 ,数据库侧设计 13 张表。
二、技术架构
系统架构:SpringBoot 接口层 + MySQL 数据层 + Vue 前台后台三段式
2.1 后端结构
| 层次 | 数量 | 说明 |
|---|---|---|
| Entity 实体 | 13 | 每张业务表一个实体类,字段与表结构一一对应 |
| Controller 控制器 | 14 | 覆盖考试、报名、准考证、成绩、三套账号、论坛、资讯、配置 |
| Java 文件总数 | 121 | 含 entity / dao / controller / service / util / config |
| Java 代码行数 | 12847 | 全部主业务代码 |
Controller 端的点分布:
| Controller | 端点数 | 职责 |
|---|---|---|
XueshengController |
16 | 学生注册、登录、报名、准考证下载、成绩查询 |
JiaoshiController |
16 | 教师登录、发布考试、审核报名、录入成绩 |
ForumController |
14 | 论坛帖子发布、回复、点赞 |
KaoshibaomingController |
12 | 考试报名记录增删改查、审核、支付标记 |
AboutusController |
11 | 关于我们页面内容维护 |
SystemintroController |
11 | 系统简介内容维护 |
NewsController |
11 | 公告资讯增删改查与展示 |
ZhunkaozhengController |
11 | 准考证生成、查询、下载 |
KaoshichengjiController |
11 | 成绩录入、查询、统计 |
KaoshixinxiController |
11 | 考试信息发布与管理 |
UsersController |
9 | 管理员登录与权限校验 |
CommonController |
8 | 公共工具接口,如文件上传下载 |
ConfigController |
8 | 系统参数配置维护 |
FileController |
3 | 文件上传、下载、图片地址生成 |
14 个 Controller 对应 14 个独立业务模块,每个模块都能在论文里独立成节,这是它做毕设最省事的地方。
2.2 前端与后台
前台位于 src/main/resources/front/front/,是 Vue + ElementUI 打包的产物(dist/),另有 public/ 静态资源。后台位于 src/main/resources/admin/admin/,同样是打包后的 dist/index.html,通过 hash 路由切换模块。
两套前端共用的组件库是 ElementUI,配合 Layui 做部分列表页。相比手写静态页,这种打包方式的好处是交互逻辑和后端接口是一一对应的 ------ 前台某个按钮点下去调哪个端点,在 Vue 源码里能直接看到,不用来回猜。
三、数据库设计
用户与权限 ER 图:学生、教师、管理员三套账号体系与业务表的关联
共 13 张表,其中 12 张是业务表,1 张是令牌表。
| 表名 | 行数 | 用途 |
|---|---|---|
forum |
11 | 论坛帖子与回复 |
kaoshibaoming |
9 | 考试报名记录 |
kaoshichengji |
9 | 考试成绩 |
kaoshixinxi |
9 | 考试信息主表 |
xuesheng |
9 | 学生表 |
zhunkaozheng |
9 | 准考证 |
jiaoshi |
8 | 教师表 |
news |
8 | 公告资讯 |
aboutus |
1 | 关于我们 |
systemintro |
1 | 系统简介 |
config |
3 | 系统配置 |
token |
3 | 登录令牌 |
users |
1 | 管理员表 |
演示数据共 81 行 ,分布在 13 张表中。外键约束 0 条 ------ 建表脚本不写外键,ER 图的关联线需要按字段语义和实际数据反推。
3.1 考试信息表:全系统的锚点
kaoshixinxi 是整个系统的主数据,11 个字段:
| 字段 | 含义 |
|---|---|
kaoshibianhao |
考试编号 |
kemumingcheng |
科目名称 |
kaoshishijian |
考试时间 |
kaoshididian |
考试地点 |
baomingfeiyong |
报名费用 |
zhuyishixiang |
注意事项 |
jiaoshizhanghao / jiaoshixingming |
发布教师账号与姓名 |
fengmian |
封面图 |
addtime |
添加时间 |
考试编号 kaoshibianhao 是贯穿全系统的关联键。 报名表、准考证表、成绩表三张表都冗余存了它,以及 kemumingcheng、kaoshishijian、kaoshididian 这几个字段。
这种冗余是有意的:考试信息可能被管理员编辑或调整,如果下游表靠外键实时关联,考试地点一改,历史准考证上印的地点就跟着变了 ------ 而准考证是要打印出来给考生带进考场的,必须冻结在生成那一刻。所以准考证表和成绩表都把考试信息快照存了一份。
3.2 报名表:20 个字段承载完整审核流
kaoshibaoming 有 20 个字段,是本系统字段最多的表:
| 类别 | 字段 |
|---|---|
| 标识 | id、kaoshibianhao |
| 考试快照 | kemumingcheng、kaoshishijian、kaoshididian、baomingfeiyong、zhuyishixiang |
| 教师快照 | jiaoshizhanghao、jiaoshixingming |
| 学生快照 | xuehao、xueshengxingming、shoujihaoma、touxiang |
| 申请信息 | kaoshishenqing(报名申请说明)、baomingshijian(报名时间) |
| 状态标记 | sfsh(是否审核)、shhf(是否回复)、ispay(是否支付) |
| 跨表关联 | crossuserid、crossrefid |
| 时间 | addtime |
crossuserid + crossrefid 这对字段是这套代码里最值得看的设计。它表示「这条记录的来源用户和来源记录」:学生从某场考试发起报名,crossuserid 指向学生 ID,crossrefid 指向考试 ID。有了这对字段,报名和考试之间就不需要外键 ,但反向查询(这门考试有哪些人报名了)依然很快 ------ 走索引扫 crossrefid 即可。
kaoshishenqing(报名申请说明)是另一个细节:让学生填一句申请理由,教师审核时能看到「重修」「补考」这类信息,审核更有针对性。
3.3 准考证表:可下载的凭证
zhunkaozheng 11 个字段,核心是 zhunkaozhengbianhao(准考证号)和 zhunkaozhengxiazai(准考证下载链接)。它同时快照了考试信息、学生信息和发放教师(jiaoshizhanghao)。
生成准考证这一步是整个流程的收口:报名审核通过 → 系统按规则生成准考证号 → 记录下载链接 → 学生在前台下载打印。准考证号和下载链接分离存储,是为了以后扩展成二维码或加密下载时不用改表结构。
3.4 成绩表
kaoshichengji 10 个字段:zhunkaozhengbianhao、kaoshibianhao、kemumingcheng、kaoshididian、kaoshiriqi(考试日期)、xuehao、xueshengxingming、kaoshichengji(成绩)、shijuan(试卷)、jiaoshizhanghao。
用准考证号而不是学生 ID 关联成绩,这个选择很实用:准考证号唯一且对外可见,学生查成绩时手里拿的就是准考证号,不用先知道自己的内部 ID。
四、三套用户体系
这是本系统比同题材项目更有特色的地方 ------ 三套账号并存:
| 体系 | 表 | 字段数 | 源码调用点 |
|---|---|---|---|
| 学生 | xuesheng |
11 | XueshengController → generateToken(..., "xuesheng", ...) |
| 教师 | jiaoshi |
9 | JiaoshiController → generateToken(..., "jiaoshi", ...) |
| 管理员 | users |
5 | UsersController → generateToken(..., "users", ...) |
学生表(11 字段):
| 字段 | 含义 |
|---|---|
xuehao |
学号(登录名) |
mima |
口令 |
xueshengxingming |
学生姓名 |
xingbie |
性别 |
shoujihaoma |
手机号码 |
youxiang |
邮箱 |
zhuanye |
专业 |
banji |
班级 |
touxiang |
头像 |
addtime |
注册时间 |
学号、专业、班级这三个字段构成了系统的「学生画像」 ------ 教师发布考试时可以按专业/班级限定报名范围,这在真实教务场景里很实用。
教师表(9 字段) :jiaoshizhanghao(教师账号)、mima、jiaoshixingming、nianling、xingbie、lianxidianhua、touxiang、addtime。
管理员表(5 字段) :username、password、role、addtime。带 role 字段,为后续细分管理员权限留了口子。
三套体系的 generateToken 调用完全对称,只是表名参数不同。从 token.tablename 的实际取值可以交叉验证:普通用户侧的令牌写进 token 表的值为「用户」。
五、核心业务流程
前台首页:考试列表与报名入口,考生侧的主界面
5.1 教师发布考试
教师登录后进入「考试信息」模块,填写科目名称、考试时间、考试地点、报名费用、注意事项,上传封面图。提交后考试信息进入 kaoshixinxi 表,前台考试列表页立即可见。
注意事项字段是给考生看的,考试时间地点的变更也要同步更新 ------ 因为下游表存的是快照,改了考试信息后已报名学生的记录不会自动跟着变,这是一致性上需要留意的点。
5.2 学生报名
学生在前台浏览考试列表,点进详情看到考试时间、地点、费用、注意事项和任课教师。点击报名后填写申请说明,提交到 kaoshibaoming 表。
报名记录初始为待审核(sfsh = 否),同时记录 crossuserid(学生)和 crossrefid(考试)。费用信息 baomingfeiyong 从考试信息带过来,支付状态由 ispay 字段跟踪。
5.3 教师审核与生成准考证
教师在后台看到待审核的报名列表,逐条审核(sfsh 置为已审核),可以填写回复(shhf)。审核通过后,系统为该学生生成准考证记录:分配准考证号、快照考试信息与学生信息、生成下载链接。
学生在前台「准考证」模块看到自己的准考证并下载打印。
5.4 成绩录入与查询
考试结束后,教师在「考试成绩」模块录入成绩,每条记录关联准考证号、科目、考点、考试日期、学生信息。学生在「我的成绩」里按准考证号或科目查询自己的成绩。
成绩表关联准考证号这个设计让「谁考了哪场、考的什么卷子、考了多少分」这条链是完整的,也避免了成绩和学生信息脱节。
5.5 论坛与资讯
系统附带论坛(forum,11 行数据)和新闻公告(news,8 行数据)两个通用模块。论坛帖子是典型的 refid + userid + nickname + content + reply 结构,公告资讯则是标准的内容管理 CRUD。这两块让系统在演示时不会显得单薄。
六、配置与部署
后台考试报名管理:教师侧逐条审核报名申请并填写审核回复
6.1 配置文件
application.yml 共 53 行,核心配置如下:
url: jdbc:mysql://127.0.0.1:3306/springboot5n9zn?useUnicode=true&characterEncoding=utf-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
username: root
password: 你的数据库密码
context-path: /springboot5n9zn
port: 8080
static-locations: classpath:static/,file:static/
6.2 静态资源路径的坑
static-locations 没有映射 front/ 目录,前台页面走 SpringBoot 对 classpath:/ 的默认兜底。所以目录是双层的,但 URL 只写一层:
| 目录里的实际文件 | 访问地址 |
|---|---|
front/front/dist/index.html |
/dist/index.html |
front/front/public/index.html |
/public/index.html |
admin/admin/dist/index.html |
/admin/admin/dist/index.html |
具体地址要在部署后 curl 实测,不能照目录名拼。
改端口要改 2 处:
| 文件 | 处数 |
|---|---|
front/front/dist/js/app.abc5b6f5.js |
1 |
front/front/src/config/config.js |
1 |
只改 application.yml 的后果是:后台能正常打开,前台一片白 ------ 前端还在往旧端口发请求。
6.3 运行方式
# 1. 建库并导入脚本
mysql -u root -p < db/springboot5n9zn.sql
# 2. 按实际环境修改 application.yml 中的数据库地址与口令
# 3. 打包运行
mvn clean package -DskipTests
java -jar target/*.jar
启动后访问 http://localhost:8080/springboot5n9zn/ 即可。
七、项目亮点
1. 三套账号体系,三种业务视角
学生管报名、教师管考试和审核、管理员管内容。相比常见的「管理员 + 普通用户」两套设计,三套体系让流程演示更有层次 ------ 答辩时可以完整演一遍三方交互,这是加分项。
2. 跨表关联靠 crossuserid / crossrefid 软关联
不建外键但保留双向可查能力,数据库层保持灵活,查询层又有索引可用。这个折中方案在教学项目里很少见,写进论文的「数据层设计」一节很有内容。
3. 下游表快照上游信息
报名表、准考证表、成绩表都冗余存了考试信息和学生信息。准考证是要打印带进考场的凭证,冻结在生成那一刻是刚需 ------ 这个设计理由写进论文比单纯说「减少 JOIN」有说服力得多。
4. 报名审核带申请说明
kaoshishenqing 让教师审核时能区分「重修」「补考」「缺考补报」,审核效率明显更高。这种从真实业务里抠出来的字段是加分项。
5. 成绩按准考证号关联
学生手里拿的就是准考证号,用它查成绩最自然,也保证了成绩和学生信息不会脱节。
6. 演示数据覆盖全部 13 张表
81 行种子数据分布在 13 张表里,三个角色登录后都有内容可看:学生有考试可报,教师有报名可审,管理员有内容可管。
八、技术栈总览
| 层次 | 技术选型 |
|---|---|
| 后端框架 | SpringBoot |
| 持久层 | MyBatis-Plus |
| 数据库 | MySQL 8 |
| 前端框架 | Vue |
| UI 组件 | ElementUI + Layui |
| 构建工具 | Maven |
| 接口风格 | REST + JSON |
| 认证方式 | Token 令牌表(学生/教师/管理员三套) |
九、适合谁用
这套系统的完整度适合直接作为本科毕业设计的底稿,也适合作为 SpringBoot 入门到进阶的学习项目:
- 做毕设 ------ 13 张表、14 个 Controller、140 个端点、三套角色,够撑起一篇有内容的技术论文;三方交互的演示路径清晰,答辩时有话可说。
- 学技术 ------ 前后端分离的标准结构,Vue 前台 + ElementUI 后台 + SpringBoot 接口,软关联设计和快照设计都是很好的学习素材。
- 做参考 ------ 多角色权限体系、跨表软关联、下游数据快照,这三个点可以直接搬进自己的项目。
十、结语
考试报名系统看着像 CRUD,实际做下来会发现三处不平凡:三套账号如何共用认证骨架 、跨表关系不用外键怎么保证可查 、准考证这种要打印的凭证该怎么冻结数据。把这三点想清楚,这个题目的技术含量就上去了。
数据库脚本、工程源码、开发文档随项目资料一起交付,导入即可运行。
关键词:考试报名系统、SpringBoot、MySQL、Vue、准考证、成绩管理、三角色权限、毕业设计