本文目录导读:

这是一个非常经典的毕业设计选题——在线考试系统,通过实现这个项目,几乎可以覆盖PHP全栈开发(从前端到后端、从数据库到服务器部署)的所有核心技能点。
为了让你清晰看到每一项技能如何落地,我会先给出项目功能架构,然后逐一拆解每个模块对应的PHP全栈技能。
项目功能架构(在线考试系统)
- 用户端(考生):注册/登录、参加考试、查看成绩、查看错题。
- 管理端(教师/管理员):学生管理、题库管理(增删改查)、试卷生成(随机组卷/手动组卷)、在线阅卷(客观题自动判分,主观题手动给分)、成绩统计与导出。
- 核心安全与性能:防SQL注入、防XSS、防重复提交、考试倒计时自动提交、并发控制。
核心技能拆解与对应实现
前端与交互(基础,但必须掌握)
- 技能点:HTML5语义化+CSS3布局(Flex/Grid)、JavaScript(DOM操作、AJAX/Fetch)、Vue.js/React(可选,但加分)。
- 在项目中如何体现:
- 答题界面:倒计时功能(使用
setInterval),选项切换。 - 自动保存:每30秒通过
AJAX将当前答案保存到localStorage或后端Session,防止断电丢失。 - 管理端:使用 Bootstrap 搭建响应式后台,用 jQuery 或原生 JS 完成“添加题目”的动态表单(点击按钮新增一行)。
- 进阶:引入 Element UI(Vue 版)或 Ant Design(React 版)来快速搭建后台UI。
- 答题界面:倒计时功能(使用
关键代码片段(自动保存):
setInterval(() => { const answers = collectAnswers(); fetch('/api/save-answer', { method: 'POST', body: JSON.stringify(answers), headers: { 'Content-Type': 'application/json' } }); }, 30000);
后端核心(PHP + 框架)
- 技能点:MVC架构、路由、ORM、依赖注入、中间件。
- 在项目中如何体现:
- 使用框架:推荐 Laravel 或 ThinkPHP,不推荐原生PHP写毕业设计(除非你硬核到要手写路由解析和自动加载)。
- MVC 分层:
- Controller:
ExamController::submit()处理提交逻辑。 - Model:
Exam.php通过 Eloquent(Laravel)关联User、Question、Answer。 - View:使用 Blade 模板引擎渲染答题页面。
- Controller:
- 路由:
Route::post('/exam/submit', [ExamController::class, 'submit'])->middleware('auth')。 - 中间件:
AuthMiddleware检查登录状态,ThrottleMiddleware限制请求频率防刷题。
关键点:防御重复提交 —— 考试结束时,前端禁用按钮 + 后端使用
Redis锁或数据库唯一索引(user_id + exam_id)双重保险。
数据库设计(MySQL/PostgreSQL)
- 技能点:ER图设计、范式与反范式、索引优化、事务、复杂查询。
- 在项目中如何体现:
- 核心表:
-- 用户表 users (id, username, password_hash, role) -- 题目表 questions (id, exam_id, type[单选题/多选题/简答], content, score) -- 选项表(分离避免冗余) options (id, question_id, content, is_correct) -- 考试记录表 exam_records (id, user_id, exam_id, start_time, submit_time, total_score) -- 答题详情表 answer_details (id, exam_record_id, question_id, user_answer, score, is_correct)
- 索引设计:在
exam_records的user_id和exam_id上加 联合索引。 - 事务:提交试卷时,
beginTransaction-> 写入所有answer_details-> 计算总分 -> 更新exam_records->commit,若中间失败则rollback。
- 核心表:
安全与防御(PHP全栈必考点)
- 技能点:SQL注入防御、XSS过滤、CSRF Token、数据验证。
- 在项目中如何体现:
- SQL注入:使用 Eloquent ORM 或 PDO 预处理,绝对不要拼接SQL
"SELECT * FROM users WHERE id =".$_GET['id']。 - XSS:渲染答案时使用
htmlspecialchars($question->content, ENT_QUOTES, 'UTF-8'),前端 Vue.js 已默认转义。 - CSRF:Laravel 的
@csrf指令自动生成 token。 - 验证:使用 Laravel 的
Validator规则'email' => 'required|email|unique:users','score' => 'integer|min:0|max:100'。
- SQL注入:使用 Eloquent ORM 或 PDO 预处理,绝对不要拼接SQL
缓存与性能(加分项)
- 技能点:Redis/Memcached、静态化、SQL查询优化。
- 在项目中如何体现:
- 试卷缓存:将“组好的试卷”存入 Redis,过期时间设为考试时长 + 1小时,避免每次刷新都查数据库。
- 会话共享:当使用多台服务器时,session 存到 Redis。
- 倒计时判断:使用 Redis TTL 存储考试结束时间戳(而不是依赖前端JS计时,JS可能被篡改)。
接口与通信(RESTful API)
- 技能点:JSON API、状态码规范、版本控制。
- 在项目中如何体现:
- 当你需要做移动端或 Vue 前后端分离时,接口应像这样:
GET /api/v1/exams(获取考试列表)POST /api/v1/exam/{id}/submit(提交答案)
- 返回格式:
{ "code": 200, "message": "提交成功", "data": { "score": 85 } } - 关键:对敏感数据(如成绩)进行鉴权,避免通过接口遍历他人数据。
- 当你需要做移动端或 Vue 前后端分离时,接口应像这样:
部署与运维(让项目运行起来)
- 技能点:Linux命令、Nginx/Apache配置、环境搭建、Git。
- 在项目中如何体现:
- 环境:使用 Docker(PHP+MySQL+Redis)一键部署,或手动在宝塔面板配置。
- Nginx配置:伪静态规则让URL去掉
index.php。 - Git:使用GitHub管理代码,通过
.gitignore抛出.env配置文件。 - 域名与HTTPS:可以用
frp内网穿透或免费服务器(如阿里云学生机)绑定域名。
项目管理(毕业设计亮点)
- 技能点:版本控制、协作、文档、测试。
- 在项目中如何体现:
- Git Flow:建立
main和develop分支,每个功能开一个feature/xxx分支。 - 文档:撰写
README.md,包含项目简介、ER图、API文档(推荐 Swagger)、启动步骤。 - 单元测试:使用 PHPUnit 对
ExamController::scoreCalculate()函数写测试用例。 - 压力测试:使用 JMeter 模拟 100 人同时交卷,观察数据库连接池是否溢出。
- Git Flow:建立
如何用这个项目证明你会PHP全栈?
当你在答辩或简历上展示“在线考试系统”时,逐条对应提示:
| 面试官感兴趣的点 | 你的项目如何体现 | 对应的核心技能 |
|---|---|---|
| 项目管理 | GitHub仓库+README+Swagger API文档 | Git / 文档能力 |
| 前端交互 | 倒计时自动交卷、答案防丢失 | JS / AJAX / 本地存储 |
| 后端能力 | MVC架构、ORM、Redis缓存、事务 | Laravel/ThinkPHP、Redis |
| 安全意识 | 防SQL注入、XSS、CSRF + 权限控制 | 安全开发规范 |
| 数据库设计 | 合理的表结构、索引、1个复杂查询(如查错题) | MySQL设计 |
| 性能优化 | 试卷缓存、数据库连接池、秒杀式交卷 | Redis + 高并发处理 |
| 部署能力 | Docker Compose / Nginx + PHP-FPM + HTTPS | Linux / DevOps |
最后建议: 不要等到所有功能都完美再开始写论文或报告。先写出一个能用的最小版本(注册 -> 选试卷 -> 答题 -> 自动判分),这个流程跑通后,再迭代加入“手动组卷”、“成绩导出Excel”、“Redis缓存”等进阶功能,这样可以确保答辩时有可展示的成果,同时体现你的迭代开发能力。