SlateCourt 羽毛球场馆与约球应用
面向悉尼羽毛球的移动优先 PWA —— 54 个场馆目录、汇总自场馆公开预订页面的实时场地空位、支持费用分摊的打球账本,以及好友与小组社交层。个人非商业演示项目,以邀请制在我自己的球友圈软启动。
- 角色
- 独立开发 · 从产品到基础设施
- 年份
- 2026
- 类型
- PWA · 个人演示
- 状态
- 运行中

找到场地,记住打得好的那些。 打完把账分清。
大多数场馆没有预订 API,所以 Slate 从不假装能替你订场 —— 它展示真实的空位,把你引导到场馆完成预订,然后把这场球本身变成产品:谁来了、花了多少、谁付了钱、用了什么装备。双语(中/英)、可安装到主屏,并由个人邀请码把关注册。
为什么做这个
为真实圈子做的真实产品为我自己的悉尼羽毛球圈而做:注册需要邀请、每个成员都有自己的邀请码,好友、小组、约球链接这些社交功能,都是从我们每周真实的组局方式里长出来的。
不做虚假的"实时"承诺。只有场馆自己的订场系统真正可读时才显示空位 —— 目前 54 个场馆中有 16 个 —— 其余保持为诚实的目录,一键跳转到场馆预订。
仅限个人使用
SlateCourt 是为我自己的球友圈构建的个人非商业演示项目 —— 注册必须使用邀请码。空位功能只读取场馆自己公开发布、无需登录的预订页面,读取频率低且带缓存,每条结果都链接回场馆自己的预订网站。不转载、不出售任何场馆数据,本项目与任何场馆或订场平台均无关联。
一览
数据一览全栈维度
七个维度前端
PWA 与界面后端
类型化 API数据
持久化与缓存认证
邀请制实时空位
抓取管线测试
质量关卡DevOps
07 · 把一切发布出去的那一层线上实况
桌面端 · 移动端

实时空位如何工作
抓取管线大多数场馆没有公开 API,但它们的公开预订页面会渲染按日期参数化的 HTML,任何访客的浏览器都能直接打开。一个小型 Cloudflare Worker 以低频、带缓存的节奏读取这些免登录页面,按平台的适配器把页面解析成归一化的时段网格,进程内调度器对热门场馆刷新得稍频繁一些。网格写入 Redis,由 FastAPI 提供给发现页筛选和场馆页 —— 每条结果都链接回场馆自己的预订网站。新增场馆只是加一条配置,不用写代码。
场馆配置
(平台, base_url, id) —— 配置而非代码
Worker 读取
公开免登录页面 · 带缓存
适配器
YEPbooking · SportLogic HTML 解析
归一化
按场地、按日期的时段网格
调度
APScheduler · 冷热分层
缓存
Redis 网格 + TTL
服务
FastAPI 空位端点
发现
实时徽标 + 按你的时间筛选
取舍
站得住的决策打球账本,而不是订场引擎
大多数场馆没有公开预订 API,所以 Slate 从不伪造站内预订。你在场馆完成预订,Slate 负责记录这场球 —— 谁来了、花了多少、谁付了钱。记录和分账本身就是留存闭环。
Next.js + FastAPI 双应用 Monorepo
SQLAlchemy 2.0 async 能用尽数据模型想要的每一个 Postgres 特性;FastAPI 自动产出 OpenAPI,openapi-typescript 让前端契约端到端强类型,零手写 API 类型。
前端 Better-Auth,后端校验 JWT
Next.js 里白拿一流的通行密钥体验;FastAPI 通过一个小依赖校验共享密钥 JWT。Traefik 同域路由让 Cookie 天然生效 —— 没有 CORS,也不用折腾域名。
经 Cloudflare Worker 读取公开页面
场馆预订页面是匿名、按日期参数化的 HTML —— 不绕过任何登录,也不需要无头浏览器。轻量 Worker 以低频、带缓存的节奏读取,仅供个人使用,让 8 GB 的源站机器保持轻负载。


