源码阅读笔记:Seat Reservation System 的定时任务与状态机设计
736 字
4 分钟
源码阅读笔记:Seat Reservation System 的定时任务与状态机设计

Seat Reservation System 源码阅读笔记
Seat Reservation System 是一个前后端分离的自习室座位预约系统(Spring Boot 2.7 + Vue 2)。这篇文章记录我阅读它的源码时,认为最值得学习的三个设计。
一、座位状态机:用数字流转约束业务规则
自习室座位的核心是一个状态机。reservation 表的 status 字段定义了完整流转:
| 状态值 | 含义 | 触发动作 |
|---|---|---|
| 0 | 待签到 | 用户预约成功 |
| 1 | 使用中 | 到场扫码签到 |
| 2 | 未及时签到 | 超时自动判违规 |
| 3 | 暂离 | 用户主动暂离 |
| 4 | 暂离超时 | 定时任务检测 |
| -1 | 完成 | 使用结束,释放座位 |
这个设计的价值在于:所有业务操作最终都收敛为状态变更。
- 用户签到 →
0 → 1 - 用户暂离 →
1 → 3 - 用户回来 →
3 → 1 - 暂离超时 →
3 → 4 - 使用结束 →
1 → -1
每个状态变更都绑定一个副作用(释放座位 / 扣信用分 / 记违规),代码路径非常清晰。
二、TimerTask:异常场景的自动兜底
系统最复杂的地方不是正常流程,而是异常场景。预约了不来怎么办?暂离了一直不回来怎么办?
项目的答案是 TimerTask 定时任务:
// 伪代码示意:预约超时未签到自动判违规TimerTask checkSignTimeout = new TimerTask() { @Override public void run() { // 找到所有 status=0 且超过签到时间的预约 List<Reservation> timeoutList = reservationMapper .findTimeoutReservations(now());
for (Reservation r : timeoutList) { r.setStatus(2); // 未及时签到 seatService.release(r.getSeatId()); creditService.deduct(r.getUserId(), 10); // 扣信用分 violationService.record(r.getId(), "超时未签到"); } }};定时任务每 N 分钟扫一次,把「应该发生但用户没做」的事情自动补掉。这是典型的最终一致性思路——不依赖用户操作,系统自己兜底。
三、信用分:约束行为的奖惩机制
信用分是这个系统里很巧妙的约束设计:
- 初始 100 分
- 超时未签到 → 扣分
- 暂离超时 → 扣分
- 教师可手动加/扣分
- 信用分过低 → 限制预约权限
它不是简单的惩罚,而是用分数门槛间接控制资源分配。分数低的人自动失去预约资格,不需要管理员手动拉黑。
前端:双 UI 库的组合
这个项目的前端架构也值得注意:
- PC 端管理界面 → Element UI 2.15(给管理员/教师用)
- 移动端 H5 → Vant 2.12(给学生用)
同一套后端 API,根据设备类型加载不同的 UI 库。Axios 统一封装,通过 devServer.proxy 把 /api 代理到后端 9003 端口。
总结
这个项目的复杂度不高,但异常处理的设计意识很到位。定时任务兜底、状态机约束流转、信用分约束行为,这三板斧在很多业务系统里都适用。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
源码阅读笔记:Seat Reservation System 的定时任务与状态机设计
https://blog-tyb.pages.dev/posts/seat-reservation-analysis/相关文章智能推荐
1
多商户商城系统源码解析:一笔订单背后的拆单、渲染与兜底
源码解析深入一个 B2B2C 多商户商城的 Java 源码,拆解交易-订单两级拆单、购物车渲染流水线、定时兜底与商家端数据隔离四个核心设计。
2
DeepStudy 源码解析:三层卷积 CNN 的标准训练范式
源码解析拆解 DeepStudy 的 MNIST CNN 实现:三层卷积的尺寸推导、log_softmax+NLLLoss 组合、训练五步循环与完整的保存加载闭环。
3
TaskWeaver 源码解析:LangGraph 四节点循环 Agent 架构
源码解析深入 TaskWeaver 源码,拆解 Planner-Executor-Reviewer-Responder 四节点循环图的实现,以及它如何用双计数器防止 Agent 死循环。
4
一个 HTML 文件的分账工具:bill-splitter 纯函数设计赏析
源码解析分析 bill-splitter 的 __split 纯函数:四条不变量约束、最大余数法零头分配、以及为什么防御性编程在小工具里同样重要。
5
如何阅读优秀开源项目的源码
学习方法分享一套可复用的源码阅读方法论:从宏观架构到核心链路,再到设计模式的落地应用。
随机文章随机推荐









