预约系统与智能门锁对接

教会场地预约与智能门禁系统

为一间大型教会无偿开发:同工在线预约场地,审批通过后系统自动给门锁下发限时密码,到期回收,每次开门都能追到是哪一条密码。目前在内测。

  1. 用户在线预约场地
  2. 管理员审批(超时自动拒绝)
  3. 系统给门锁下发限时密码
  4. 用户凭密码开门
  5. 开锁记录回传并对应到具体密码
  6. 到期自动回收密码

背景

这间教会需要一套系统:同工在线预约场地,管理员审批,门锁按预约自动开放,开门记录有据可查。我无偿承担了全部设计和开发。

我做了什么

  • 用户端:短信验证码注册(管理员审核)、微信登录;场地列表显示时段占用;团队预约和个人预约;修改分三档(只改内容、缩短时段、改期,改期要重新审批);门锁密码页;报修和借用场地。
  • 管理端:仪表盘、审批和代客预约;场地分开放、受限、专属三种使用模式;门锁监控(状态、日志、告警、吊销);闲置检测、团队树、报表、审计日志、系统配置;权限能力点勾选表。

难点和解法

  • 三类门锁密码的生命周期:审批通过后下发限时码,前后留缓冲时间,取消或到期即吊销;一次性码有有效期、同时有效上限和冷却期;专属场地的常驻码 48 小时有效、每 24 小时轮换。
  • 开锁追溯:开锁记录回传后,找出开锁时刻有效的密码,排除已被新码取代的常驻码和开锁前就吊销的码,把每次开门对应到具体的一条密码。
  • 区分告警和真实开门:告警类记录不算有人开门,输错密码不算用过;同步失败或门锁离线时,不会误把预约当作没人使用而自动释放。
  • 并发:SQLite 的事务挡不住「先查冲突、再写入」的竞态,所以按场地、团队等键在进程内串行,并规定唯一允许的嵌套顺序,从结构上避免死锁。
  • 密钥管理:门锁和短信等密钥加密存储、永不回传浏览器;门锁密码用 AES-256-CBC 加密;生产环境启动时强制校验密钥长度。
  • 技术取舍:评估后明确不上 PostgreSQL、Redis、ELK——单机 SQLite 加备份足够这个规模,理由都写进了文档。

技术栈

React 19 · Vite · TypeScript · Tailwind · Zustand · Express · Prisma · SQLite · 涂鸦开放平台 · 微信 · 阿里云短信 · Vitest · Docker · Caddy

截图

← 返回首页