预约系统与智能门锁对接
教会场地预约与智能门禁系统
为一间大型教会无偿开发:同工在线预约场地,审批通过后系统自动给门锁下发限时密码,到期回收,每次开门都能追到是哪一条密码。目前在内测。
- 约 1,600名同工使用,常用约 200 人(内测中)
- 1,364个服务端测试用例,另有管理端 151 个
- 29个权限能力点,配合角色和团队层级
- 11个定时任务,由一张任务表统一调度
- 用户在线预约场地
- 管理员审批(超时自动拒绝)
- 系统给门锁下发限时密码
- 用户凭密码开门
- 开锁记录回传并对应到具体密码
- 到期自动回收密码
背景
这间教会需要一套系统:同工在线预约场地,管理员审批,门锁按预约自动开放,开门记录有据可查。我无偿承担了全部设计和开发。
我做了什么
- 用户端:短信验证码注册(管理员审核)、微信登录;场地列表显示时段占用;团队预约和个人预约;修改分三档(只改内容、缩短时段、改期,改期要重新审批);门锁密码页;报修和借用场地。
- 管理端:仪表盘、审批和代客预约;场地分开放、受限、专属三种使用模式;门锁监控(状态、日志、告警、吊销);闲置检测、团队树、报表、审计日志、系统配置;权限能力点勾选表。
难点和解法
- 三类门锁密码的生命周期:审批通过后下发限时码,前后留缓冲时间,取消或到期即吊销;一次性码有有效期、同时有效上限和冷却期;专属场地的常驻码 48 小时有效、每 24 小时轮换。
- 开锁追溯:开锁记录回传后,找出开锁时刻有效的密码,排除已被新码取代的常驻码和开锁前就吊销的码,把每次开门对应到具体的一条密码。
- 区分告警和真实开门:告警类记录不算有人开门,输错密码不算用过;同步失败或门锁离线时,不会误把预约当作没人使用而自动释放。
- 并发:SQLite 的事务挡不住「先查冲突、再写入」的竞态,所以按场地、团队等键在进程内串行,并规定唯一允许的嵌套顺序,从结构上避免死锁。
- 密钥管理:门锁和短信等密钥加密存储、永不回传浏览器;门锁密码用 AES-256-CBC 加密;生产环境启动时强制校验密钥长度。
- 技术取舍:评估后明确不上 PostgreSQL、Redis、ELK——单机 SQLite 加备份足够这个规模,理由都写进了文档。
技术栈
React 19 · Vite · TypeScript · Tailwind · Zustand · Express · Prisma · SQLite · 涂鸦开放平台 · 微信 · 阿里云短信 · Vitest · Docker · Caddy
截图


