考试报名系统的设计与实现(SpringBoot + MySQL + Vue 三角色平台)

考试报名系统的设计与实现(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、准考证、成绩管理、三角色权限、毕业设计

相关推荐
Adellle26 分钟前
设计模式指南 (Java 版) ㊁
java·开发语言·设计模式
特立独行的猫A1 小时前
cj-tauri:用仓颉写桌面与鸿蒙 PC 应用
java·后端·python
Lonely丶墨轩1 小时前
从一个 404 到负数 ID:第三方接口开发中的几次排错
java
聪明的笨猪猪1 小时前
实际工程问题:AI生成MyBatis批量操作的SQL超限与性能雪崩
java·经验分享·面试·ai编程
文丑颜不良啊1 小时前
LeetCode2501~2520题目解析
java·leetcode
欢醉1 小时前
SpringBoot中@Async异步透传问题内部分享
springboot·springcloud·asynctask异步更新
瑞雪兆丰年兮2 小时前
JavaWeb-day07-MySQL(DQL&多表设计)
java·开发语言·数据库·sql·mysql·javaweb·web
唐老板2 小时前
Spring Boot 4 默认开虚拟线程,HikariCP 却成瓶颈
java
2601_9621066411 小时前
【Java Set综合实战】商品管理系统 + 图书收藏系统|Product、Book自定义类全套代码
java