1. 先看懂这个题目:三个花哨名称背后的共同内核
很多同学拿到毕设题目时,第一反应是被名字唬住。"互动小课堂""智慧课堂""云课堂即时教学辅助系统"——听起来像是三个完全不同的项目,实际拆开看,核心是同一件事:用移动端小程序,在课堂上建立师生之间的实时互动通道。
这类题目的本质需求很简单,但业务场景很具体:传统课堂里,老师提问只能点少数几个学生回答,其他人在不在听、懂没懂,老师完全没数。把课堂搬到小程序上之后,签到、抢答、随堂测验、匿名提问、弹幕讨论这些动作都能实时完成,老师端可以看到全班的数据汇总,学生端只需要在手机上点几下。这既降低了课堂互动的门槛,也让教学数据沉淀下来。
围绕这个核心,标题里三个名称分别对应了三种表述侧重:"互动小课堂"强调师生双向互动,"智慧课堂"强调数据驱动的教学改进,"云课堂"强调远程与现场的融合。但落到开发层面,系统的使用流程图基本一致:
- 教师登录后台,创建课程、开启签到、发起抢答或测验
- 学生微信扫码或搜索小程序进入课堂
- 课堂中完成各项互动任务
- 教师端实时查看统计结果
我做这个项目时的第一建议是:拿到题目先别急着写代码,把"这个系统到底要解决什么场景下的什么问题"用一段话写清楚。毕设答辩时老师最爱问的问题就是"你为什么要做这个",答不上来比代码有Bug更致命。而且,需求边界越清晰,后面的工作量估计越准。
另外要提醒一点:这类题目往往是"一人分饰两角"——你既要当老师设计互动规则,又要当学生体验互动流程,同时还是开发者、测试员、部署运维。角色多了容易乱,我的做法是用表格把所有功能按"教师端/学生端/管理端"分列,再标注每个功能的优先级和实现难度,从P0到P3排序。P0是必须做的核心闭环,比如签到、抢答、测验;P1是加分项,比如数据统计、导出报告;P2/P3是锦上添花,有时间再做。
这样做还有一个好处:论文的需求分析章节可以直接复用这套表格,工作量描述和功能设计图都顺带解决了。
2. 技术选型复盘:SpringBoot、小程序与周边组件的搭配逻辑
2.1 后端框架:为什么SpringBoot是这类毕设的"标准答案"
用Java做毕设,框架十有八九是SpringBoot。别急着觉得"烂大街",它在这类项目里就是最稳妥的选择。原因有三:
第一,生态成熟。SpringBoot + MyBatis-Plus + Redis + MySQL这套组合,网上资料多到看不完,踩坑时随便一搜就有方案,对毕设阶段的学生极其友好。
第二,开发效率高。相比传统SSM框架,SpringBoot的自动配置省掉了大量XML配置,一个注解就能启动内嵌Tomcat,本地开发不用单独装服务器。
第三,答辩时有的聊。SpringBoot的自动配置原理、starter机制、内嵌容器、约定优于配置,这些都是比较有深度的考点,比"我用SSM框架写的"更容易展开。
版本选择上,我当时用的是SpringBoot2.7.x。为什么不追3.x?因为3.0开始强制要求JDK 17,而且部分第三方组件的兼容性还在磨合期。毕设追求的是稳定跑通,没必要在环境兼容上给自己挖坑。如果你的电脑只装了JDK 8,那就老老实实用2.7.x;如果非要上3.x,记得把JDK升到17以上,还要注意javax命名空间改成jakarta的迁移问题。
2.2 前端载体:原生小程序与uniapp的取舍
做微信小程序,有两种主流路线:官方原生开发和跨端框架uniapp。这两种我都试过,这里直接说结论:
- 原生小程序:性能和调试体验最好,微信开发者工具对原生代码的支持最完整,API调用直来直去,不需要额外封装。缺点是只能跑微信,代码没法复用到支付宝小程序或其他平台。
- uniapp:写一套Vue语法,可以打包到微信、支付宝、百度等多个小程序平台,还能打包成App。缺点是运行时的兼容层会引入一些性能损耗,小程序端某些高级API需要条件编译处理。
毕设场景下,我强烈建议选原生小程序。理由很简单:题目要求的就是微信小程序,不需要跨平台;原生代码结构清晰,论文里画架构图更容易解释;调试时遇到的问题更少,因为官方文档和社区讨论都直接针对原生语法。
如果你之前只学过Vue,担心原生小程序上手难,其实完全没必要。小程序的页面逻辑和Vue非常像,data里定义数据,setData更新视图,wx.request发请求——和Vue的data+"方法里改数据再渲染"的思路如出一辙。花一天时间看官方文档,基本就能写页面了。
2.3 实时互动怎么实现:WebSocket与HTTP轮询的博弈
课堂抢答和弹幕这类功能,对实时性有要求。实现方案无非三种:
| 方案 | 实时性 | 实现难度 | 服务器压力 | 适用场景 |
|---|---|---|---|---|
| HTTP轮询 | 弱,延迟取决于轮询间隔 | 低 | 高,频繁请求 | 签到状态刷新 |
| WebSocket | 强,服务端主动推送 | 中高 | 低,长连接 | 弹幕、抢答结果 |
| 第三方IMSDK | 强 | 低 | 由服务商承担 | 但毕设不宜引入太重依赖 |
我的做法是两者混用:核心的弹幕和抢答用SpringBoot集成WebSocket,签到和测验结果用HTTP接口查询。混合的原因在于,WebSocket长连接在弱网环境容易断开,课堂签到这种低频操作没必要挂长连接;而弹幕是高频实时消息,轮询会造成大量无意义请求,必须用推送。
SpringBoot集成WebSocket不算难,一个@ServerEndpoint注解就能建一个WebSocket端点,配合ConcurrentHashMap维护在线会话。需要注意的坑在后面章节细讲。
配套组件方面,Redis在这个项目里承担了三件事:存储签到状态、做抢答排行榜、限流防刷。MyBatis-Plus负责数据库操作,Hutool工具类帮我省了不少写日期格式化、ID生成、加密算法的功夫。
3. 课堂互动核心模块的数据库设计与接口清单
3.1 功能矩阵:哪些模块必须做,哪些是加分项
做完技术选型,紧接着要做的就是功能模块拆解。我这个项目的P0功能如下:
- 用户登录与角色区分:微信授权登录,自动识别教师/学生身份
- 课程管理:教师创建课程,生成课程码,学生凭码加入
- 课堂签到:教师开启签到,学生一键签到,教师端实时显示签到人数
- 随堂测验:教师发布选择题,学生作答,系统自动统计正确率
- 抢答积分:教师发起抢答,第一个抢到的学生获得回答机会
- 弹幕提问:学生发文字消息上墙,教师可设置匿名模式
P1加分项包括:签到数据导出、课堂表现评分、历史课程回看、公告通知。如果时间紧张,P1可以只做数据统计和导出,这两个功能在论文"系统测试"章节最好用——能截图展示真实数据。
数据库设计是这份工作量里最容易被忽视的部分,却是答辩时展示"系统设计能力"的关键。我用了8张核心表:
user:用户表(openid、昵称、头像、角色)course:课程表(课程名、课程码、教师ID)course_student:选课关系表(学生与课程的关联)sign_record:签到记录表(课程ID、学生ID、签到时间)quiz:测验表(课程ID、题目、选项、正确答案)quiz_record:作答记录表(学生ID、选项、是否答对)quick_response:抢答记录表(课程ID、学生ID、抢答时间)barrage_message:弹幕表(课程ID、学生ID、内容、是否匿名)
3.2 接口设计:RESTful规范与权限控制粒度
后端接口按RESTful风格设计,统一返回格式为Result对象,包含code、message和data三个字段。以签到模块为例,核心接口如下:
| 接口 | 请求方式 | 路径 | 功能说明 |
|---|---|---|---|
| 创建课程 | POST | /api/course/create | 教师创建课程,返回课程码 |
| 加入课程 | POST | /api/course/join | 学生输入课程码加入 |
| 开启签到 | POST | /api/sign/start | 教师开启签到,生成签到任务 |
| 执行签到 | POST | /api/sign/do | 学生提交签到请求 |
| 签到统计 | GET | /api/sign/stats | 教师端获取签到人数列表 |
| 发布测验 | POST | /api/quiz/publish | 教师发布一道选择题 |
| 提交答案 | POST | /api/quiz/submit | 学生提交选项答案 |
| 测验结果 | GET | /api/quiz/result | 获取正确率统计 |
接口设计的核心原则是职责单一,每个接口只做一件事。很多同学喜欢设计一个万能接口,比如/api/classroom/all,一个接口返回所有数据,前端自己挑——这样做的后果是接口参数和返回结构越来越乱,前端转换逻辑越来越复杂,维护成本直线上升。正确做法是宁可接口数量多一点,也要保证每个接口语义清晰。
权限控制上,我做了两层:接口层面用拦截器校验Token和角色(教师或学生),页面层面根据角色渲染不同的菜单和操作按钮。上一章说的JWT在这里派上用场,拦截器里先从Header取出Token,解析出用户ID和角色,再判断是否有权限调用当前接口。
3.3 一次完整的课堂互动流程:时序拆解
以"抢答"为例,完整流程是这样的:
- 教师端在小程序中点击"开启抢答",前端调用
POST /api/quick/start,后端向Redis写入一个标记,表示该课程处于抢答开放状态。 - 后端通过WebSocket向该课程所有在线学生推送一条消息:
{"type":"QUICK_START"}。 - 学生端收到消息,页面弹出抢答按钮并开始倒计时。
- 学生点击按钮,前端调用
POST /api/quick/grab,带上课程ID和学生ID。 - 后端处理抢答请求,用Redis的原子操作(
SETNX)保证同一课程只有第一个请求能成功——这一步非常关键,直接决定了抢答的公平性。 - 抢答成功的学生前端跳转到回答页面;失败的学生看到"手慢了"的提示。
- 后端通过WebSocket广播抢答结果,所有学生端刷新显示"某某同学抢到了"。
把时序图这段写进论文,就是现成的"系统核心流程设计",不需要再费劲想别的。
4. 安全开发专项:毕设答辩里最能拿分的一环
4.1 用户认证链路:从微信登录到Token鉴权
小程序没有传统的账号密码流程,微信官方推荐的做法是wx.login换取code,后端拿code向微信接口换取openid和session_key。这个环节的安全细节很多,我逐一说明:
第一步,小程序端调用wx.login(),拿到临时code。这个code有效期只有5分钟,且只能使用一次,所以一定要在后端实时换取,不能存库。
第二步,后端收到code后,调用微信接口jscode2session,传入小程序appid和appsecret,换取openid和session_key。这里有个大坑:appsecret绝不能暴露在小程序前端代码里。有的同学图省事,在前端直接调微信接口换取openid,appsecret就泄露了。正确做法是后端封装这个逻辑,前端只传code。
第三步,后端用openid查数据库,如果用户不存在就自动注册。注册时不需要用户主动填用户名密码,只需要在前端调用wx.getUserProfile获取昵称头像,一并提交给后端更新资料。
第四步,认证成功后,后端生成JWT Token返回给前端。Token里我放了三样信息:用户ID、角色、过期时间。前端把Token存在本地缓存wx.setStorageSync里,后续每次请求都在Header里带上Authorization: Bearer <token>。
关于Token过期策略,我采用的是双Token机制:accessToken有效期2小时,refreshToken有效期7天。accessToken过期后,前端用refreshToken请求新Token,用户无感知续期。这个机制在毕设里已经算进阶设计了,答辩时提出来会很加分。
4.2 接口安全:参数校验、防重复提交与限流
安全开发不只是登录鉴权,接口层的数据校验和防刷设计才是真正体现工程能力的地方。
参数校验我用的是Hutool的Validator工具类加SpringBoot的@Validated注解。举个例子,签到接口接收课程ID和学生ID,如果课程ID为空或者格式不对,直接返回参数错误,不进入业务逻辑。有人觉得这是小题大做,但接口一旦开放到公网,各种扫描器就会拿畸形参数来探测,不做校验很容易被绕过去。
防重复提交:学生可能因为网络卡顿,在抢答或提交测验时连续点了好几次按钮。前端要做按钮置灰,后端也要有兜底。我的方案是在Redis里用SETNX命令写入一个带过期时间的Key,Key的格式是submit:{courseId}:{studentId}:{quizId},只有第一次写入成功才允许继续执行,后续重复请求直接返回"请勿重复提交"。这个方案比用数据库唯一索引更轻量,而且天然支持分布式部署。
接口限流:为了防止恶意脚本刷接口,我在拦截器里加了简单的限流逻辑。基于Redis的计数器,在时间窗口内限制每个用户对某些敏感接口的调用次数。比如抢答接口限制为每10秒最多5次,签到接口限制为每30秒1次。限流的阈值设置要结合真实业务场景,太松防不住刷量,太紧误伤正常使用。我按P0接口逐个梳理,给不同接口配了不同阈值。
4.3 数据安全:口令存储与传输加密
用户密码这块,虽然微信登录不涉及密码,但后台管理端可能有管理员账号,密码绝不能明文存储。我用的方案是MD5加盐——等等,其实更推荐BCrypt。MD5加盐虽然比明文强,但MD5本身计算速度极快,GPU暴力破解很轻松;BCrypt算法天然带盐且计算缓慢,专门为密码存储设计。SpringBoot的spring-security-crypto包直接提供BCryptPasswordEncoder,用起来就两行代码。
传输安全方面,小程序要求正式环境必须HTTPS,这是微信平台强制规定的,天然解决了传输加密问题。本地开发阶段可以在微信开发者工具里勾选"不校验合法域名",但上线前必须配置HTTPS证书。证书我建议直接申请免费的,比如阿里云或腾讯云的免费DV证书,有效期一年,或者用Let's Encrypt的自动续期方案。Nginx配置HTTPS就几行代码,网上教程很多,这里不赘述。
另外提醒一个容易漏的点:日志中不要打印敏感信息。调试时我会在日志里输出请求参数,有一次发现用户Token被完整打印出来了——如果日志被拖库,Token就全泄露了。后来我把日志里的Token、openid、手机号等字段统一做了脱敏处理,只显示前几位和后几位。
4.4 小程序前端安全与合规
小程序前端代码是半公开的,因为小程序包会被下载到本地,JavaScript代码可以被逆向阅读。我做了几件事:
- 重要逻辑放后端:前端只负责展示和交互,所有涉及积分计算、权限判断的逻辑都在服务端完成。前端能做的就是调用接口,改前端代码最多改个样式,篡改不了业务数据。
- 隐藏appid:小程序appid在前端代码里是明文,这本身没问题,因为appid不是机密;但appsecret绝不能在代码中出现。同一台服务器上如果有多个小程序,还要注意appid和secret的对应关系,不要配错。
- 内容合规:课堂弹幕功能有用户输入内容,必须做好敏感词过滤。我集成了一个简单的敏感词库,弹幕发布时先过滤再入库。另外,按《网络安全法》要求,用户发布内容需要能够追溯到真实用户,所以匿名弹幕也是在服务端做"匿名展示"映射,数据库还是要记录真实学生ID的。这些细节写进论文的"安全设计"章节,内容立刻就充实了。
5. 实测踩坑清单:从抓包调试到并发抢答的完整排查链路
5.1 小程序接口抓包:用开发者工具和Charles定位问题
做小程序开发,抓包是基本功。前端说"接口报错了",后端说"我这里没看到请求日志",这种情况我遇到太多次了,排查链路很重要。
先明确:小程序请求必须走wx.request,而wx.request请求的是HTTP/HTTPS接口,抓包完全合法也必要。初级做法是直接用微信开发者工具自带的Network面板,它能把每个请求的URL、Header、参数、响应都列出来,已经够90%的排查场景用。我常用的排查顺序是:
- 打开微信开发者工具的Network面板,找到对应接口。
- 查看请求参数是否齐全,特别是Token是否带上。
- 查看响应状态码:4xx表示客户端问题,5xx表示服务端问题。
- 针对5xx,去后端日志看异常堆栈。
如果后端日志说"收到了请求,但参数是空的",问题多半出在前端传参格式上。小程序wx.request的data默认会序列化成JSON,但如果服务端接口要求application/x-www-form-urlencoded,两者就对不上。这种问题用抓包一秒就能看出来。
更高阶的抓包是用Charles等代理工具做中间人代理,用于查看小程序发到HTTPS接口的具体内容。配置方法不复杂,核心是让手机信任Charles的SSL证书,再把手机代理指向电脑。但需要注意:微信开发者工具已经能解决大部分调试需求,用Charles主要是为了看真实手机环境下的网络请求。如果证书配置不对,手机上所有HTTPS请求都会报错,记得用完后撤销代理设置。
5.2 分页加载的隐蔽Bug:页码越界与重复请求
小程序列表页几乎都会遇到"加载更多"的需求。最典型的错误实现是:触底一次就发一次请求,但请求还没返回时用户又触发一次,导致重复数据翻倍。排查链路如下:
- 第一次测试,快速滑动列表,发现数据大量重复。
- 查看Network面板,发现短时间内发出了多个相同参数的请求。
- 定位到前端代码,因为
onReachBottom在滚动过程中触发频率很高,没有做请求锁。 - 最终修复:加
isLoading标志位,请求期间再触发就直接return;同时在请求回调里把pageNum正确累加。
另一个隐蔽坑是页码越界:当pageNum已经超过总页数时,再触底会请求到空数据,如果代码逻辑不判断"当前已无更多数据",就永远停不下来。我在后端返回结构里加了一个hasMore字段,前端拿到hasMore: false就设置为"没有更多了",并禁止继续请求。
后端分页我用的是MyBatis-Plus的Page对象,配合pageNum和pageSize两个参数。建议pageSize固定为10到20条,不要超过50,不然一次返回的数据太多,小程序setData会卡顿。
5.3 抢答高并发的线程安全与超卖问题
抢答功能的并发问题,是我在这个项目里踩过最深的坑。最初我用数据库判断"第一个抢到的人":先SELECT查一下有没有抢答记录,没有就INSERT。单机单用户测试没问题,一到多人同时点击,就出现多条抢答记录——原因很基础:check-then-act不是原子操作,多个请求同时通过了检查,然后都插入了数据。
排查链路:
- 多台手机同时抢答,教师端显示有3个人都抢到了。
- 查数据库,发现
quick_response表里同一课程同一问题插入了多条记录。 - 查看后端日志,确认多个线程的执行顺序:线程A查到无记录、线程B也查到无记录,A插入、B也插入。
修复方案我用了Redis的SETNX做全局锁:
SET lock:quick:courseId:quizId 1 NX EX 5只有返回OK的请求才允许继续插入数据库,其他请求直接返回"手慢了"。这样做的另一个好处是,即使未来部署多台服务器,Redis锁依然有效,而数据库唯一索引在多机场景下也扛得住,但处理流程更长。实测下来,Redis锁方案在100人同时抢答的场景下,抢答结果完全正确。
5.4 WebSocket长连接的断裂修复:心跳机制与自动重连
WebSocket做课堂弹幕,最大的问题是连接不稳定。学生在教室、宿舍、食堂来回切换WiFi和4G网络,连接经常断开。断开了如果没察觉,弹幕就发不出去,还容易一直卡在"发送中"。
我的排查过程:
- 弹幕功能上线后,有学生反馈"发弹幕一直转圈"。
- 打开浏览器F12看WebSocket状态,发现连接已经
CLOSED,但页面没有任何提示。 - 查了服务器日志,发现连接是被网关主动断开的,因为一段时间内没有数据往来。
解决办法是加心跳机制:前端每30秒通过WebSocket发一次ping消息,后端收到后回pong。如果前端连续3次没收到pong,就认为连接已断,自动执行wx.connectSocket重连。后端这边,压力测试时发现连接数一直在涨,排查下来是@ServerEndpoint里的session对象没有在断开时清理,导致内存泄漏。后来在onClose回调里显式从在线列表移除,连接数才恢复正常。这个排查链路很有价值,写进论文里可以体现你考虑到了系统的健壮性。
6. 移动端体验打磨:分页加载、动态标题与弱网适配
6.1 小程序包体管理与分包加载
微信小程序主包限制2MB,如果代码超过这个体积,无法上传发布。做过几个功能后你会发现,2MB其实很快就会被图片和第三方库占满。我的处理思路是:
- 图片全部走网络地址,不放进本地包。课程封面、头像等图片都存到服务器,前端只保留默认占位图。
- 主包只放核心页面:首页、登录页、课程列表页。
- 分包加载:课堂互动相关的页面(签到、抢答、测验、弹幕)全部放进分包,用户进入课堂时才加载对应资源。小程序配置
subpackages字段就能实现,非常方便。
分包不仅能解决包体限制,还能提升首屏加载速度——用户第一眼看到的只有主包内容,其他代码不用预先下载。这个优化点我在答辩时专门做了展示,配合微信开发者工具的"性能分析"面板截图,非常直观。
6.2 动态设置标题与页面生命周期监听
两个小细节,虽然代码量不大,但对用户体验提升明显:
动态设置标题:学生加入不同课程后,小程序顶部标题如果一直显示"互动小课堂",就不知道当前在哪个课堂。我在课程详情页的onLoad里调用wx.setNavigationBarTitle,把标题动态改成课程名。这个功能实现起来一行代码,但几乎所有教程都不提,属于典型的"小动作大体验"。
监听用户离开小程序:有时学生在课堂中途切出去刷朋友圈,回来就错过了签到或抢答。我在app.js里用wx.onAppShow和wx.onAppHide监听小程序前后台切换,离开时记录时间,回来时判断是否错过了正在进行的课堂活动,弹出提示框询问要不要补签。这个小机制也被我写进了论文的功能创新点里。
6.3 弱网环境的降级策略与数据缓存
教室人多,学生手机的移动网络时好时坏。如果接口请求超时后都是直接报错,体验极差。我做了一个简单的降级策略:
- 接口超时时间统一设置为10秒,超过就提示"网络不畅,请重试",而不是无限转圈。
- 签到和测验数据提交后,在本地缓存一份记录。如果服务器返回失败,弹窗提示"已暂存,将自动重试",后台用
setTimeout尝试重新提交。 - 排行榜和签到人数这类非关键数据,接口失败时直接展示上次缓存的数据,不打断用户操作。
另外关于setData的性能,有一个原则要牢记:避免频繁、大量地setData。小程序的setData会把数据从逻辑层传到渲染层,数据量越大、频率越高,页面越卡。弹幕列表我采用了节流策略,每200毫秒才setData一次,把期间收到的多条消息合并渲染,实测弹幕活跃时页面依然流畅。
7. 部署上线与毕设演示的落地建议
7.1 从本地开发到服务器部署:环境配置清单
项目开发时在本地跑,答辩前一定要部署到一台公网服务器上,否则演示时万一本地网络出问题,整个答辩就尴尬了。服务器配置不需要太高,2核4G的云服务器足够支撑课堂规模的小程序运行。操作系统我选的Ubuntu 22.04,部署步骤如下:
- 安装JDK 8或11:
apt install openjdk-11-jdk - 安装MySQL 8.0,创建数据库和专用账号,授权远程访问(注意只对必要IP开放端口)
- 安装Redis,配置密码,修改绑定地址为内网地址
- 安装Nginx,配置HTTPS证书和反向代理到SpringBoot的8080端口
- 使用
nohup java -jar xxx.jar启动应用,或用systemd做成服务 - 上传小程序前端代码到微信公众平台,配置服务器域名
部署阶段最容易出的问题就是环境版本不一致——本地JDK 8、服务器JDK 17,跑起来各种莫名报错。我吃过这个亏,所以现在部署前第一件事就是对比三样东西:JDK版本、MySQL版本、Redis版本。建议本地装Docker,把依赖环境用容器固定下来,直接避免了环境差异问题。
7.2 演示环境的数据预置技巧
答辩演示最怕冷场:现场打开小程序,课程列表是空的,签到点了没人,课堂讨论没有弹幕。我提前做了三件事:
- 预置一个真实感强的课程:课程名就叫"软件工程2024春",里面有20条测试学生记录。
- 准备一部备用手机:一部手机登录教师端,另一部登录学生端,演示时可以同时展示"老师发起抢答、学生收到并抢答"的完整流程。
- 录制关键流程的演示视频:万一现场网络出问题,播放视频也能把功能讲清楚。这个视频存到U盘里,答辩前拷贝到演示电脑上。
数据预置时要注意:签到、测验记录的时间要模拟真实场景,不要全堆在同一分钟。答辩时老师如果翻看数据,看到时间分布符合教学流程,会觉得很真实。
7.3 论文与答辩:安全设计和并发处理是亮点
论文结构大致按"需求分析→系统设计→功能实现→系统测试→总结"来写,但有两个章节值得多花笔墨:
安全设计章节:把第四章的内容展开,从微信登录链路、Token鉴权、接口加密、防重复提交、限流、日志脱敏六个方面分别论述。每一部分都要有"问题背景→方案设计→具体实现→效果验证"的逻辑,让老师看到你不是在堆名词,而是真的理解每个安全手段的必要性。
性能测试章节:用Jmeter模拟50个并发用户同时抢答,记录响应时间以及抢答成功人数,证明Redis锁方案在高并发下的正确性。再对比加锁前后的测试结果,用数据证明优化有效。这一章是标准的加分项。
最后答辩时,老师最常问的三个问题我提前准备好答案:
- "为什么用Redis做锁不用数据库锁?"—— 回答要点:数据库锁的粒度大、跨事务时间长、并发吞吐低;Redis的原子操作天然适合"只允许一个成功"的场景,且支持分布式。
- "Token过期了怎么办?"—— 回答要点:双Token机制,accessToken短时效降低泄露风险,refreshToken续期提升用户体验。
- "小程序端怎么保证数据安全?"—— 回答要点:关键逻辑放服务端,前端只做展示;HTTPS传输;服务端严格参数校验与权限校验。
这三组问答,基本上就是整个项目技术含金量的浓缩。
做这类课堂互动小程序,我的体会是:它不像电商项目那样功能多到写不完,也不像算法项目那样深到啃不动,但它在"业务流程完整度、安全设计、高并发处理"三个维度上,给足了发挥空间。只要把第四章的安全链路和第五章的并发排查真正做扎实,答辩这块基本稳了。如果你正准备开工,记住先画功能矩阵,再定数据库表结构,最后动代码——顺序反了,后面返工多到你想哭。