BACK
Venue Operations · Transactions · Vue 3 / Tornado

BF Badminton

面向羽毛球馆日常运营的全栈平台,将线上预约、到店开场、会员储值、商城取货和经营核对串联起来,为用户、前台、管理员和维修人员提供各自的工作区。

Role全栈开发者
Focus场馆协作与交易一致性
StackTornado / Vue 3 / Redis
BF 羽毛球馆连续两小时选场、金卡九折报价与模拟支付宝选项
连续选时与会员报价:选择 18:00–20:00,原价 200 元,金卡九折后 180 元。截图仅展示报价与支付方式,未提交订单。

不只解决订场,还要接住场馆每天的工作

BF 羽毛球馆以线上预约与到店服务共享场地安排为基础,连接会员账户、支付订单、商品库存、取货凭证、赛事和社区。普通用户办理预约与消费,前台处理散客开场、储值和取货,管理员负责经营与权限管理,维修人员只读查看维护安排。

前端使用 Vue 3、TypeScript、Pinia 与 Element Plus,后端采用 Tornado 异步请求模型,通过 aiomysql 连接池和异步 Redis 客户端处理网络与数据库 I/O。

Python Tornado
Vue 3
TypeScript
Pinia
MySQL / InnoDB
Redis
JWT
Nginx

本页截图拍摄于 2026-09-29,来自本地独立演示环境,界面保留中文原貌;历史交易主要发生于 9 月 24 日。支付是项目内模拟,不是支付宝官方沙箱或真实转账。正式 HTTPS 部署、微信公众号挂链和真实扫码设备仍需另行验收。点击图片可打开原图。

用事务、行锁与幂等保护每一次占场和收款

当前新预约以 MySQL 事务为权威边界:先用 FOR UPDATE 锁定相关场地行,再复核有效预约、维护占用和报价;预约、支付单与审计记录在同一事务中提交。线上订场、到店开场、续场和改期使用统一的冲突规则。Redis 保留验证码、令牌和既有临时锁等用途,但不再是新预约占场防重的主要依据。

01 / ASYNC I/O
异步接入
Tornado 协程配合异步 MySQL 与 Redis 客户端,减少 I/O 等待造成的线程阻塞。
02 / COURT ROW LOCK
统一锁定场地
线上、柜台、改期与维护在事务中锁定场地行,再检查时间区间和有效占用。
03 / IDEMPOTENCY
幂等与唯一约束
记录请求号、参数摘要和处理结果;同号重试复用结果,同号变参拒绝,避免重复入账与核销。
04 / EXPIRATION
超时与失败恢复
待付过期释放场地、库存或余额占用;关键状态与流水同事务提交,失败整体回滚。

项目已保存一轮经真实 Tornado HTTP 路由、JWT 与角色校验的测量:macOS arm64、Python 3.14.3、MySQL 5.7.28,连接池上限 10。每类先执行一次首请求,再以 20 并发上限执行 200 次请求。

本地并发样本(2026-09-24)
场景P50 (ms)P95 (ms)失败 / 样本
商城结算报价15.3917.930 / 200
商城模拟收款61.0074.460 / 200
全局流水查询305.47349.480 / 200
查看原始测量记录(JSON)
这些数字来自 2026-09-24 的本地隔离数据库测试,不代表生产 QPS、千级并发或公网多实例容量,也不是本次截图更新重新跑出的成绩。

从连续场次推荐,到报价确认与改期结算

用户可在时间表中连续选时,也可以给出最早开始时间、运动时长与场地偏好,让系统寻找完整空闲窗口。推荐算法通过前缀和筛选连续时段,再按时间偏差、偏好、价格及零散空档排序,最多返回三个候选并解释理由;推荐不占位,下单时仍需重新检查。

确认预约前展示原价、会员折扣、应付金额与可用余额,支持储值余额或项目内模拟支付宝。价格或权益变动会要求重新确认;有效待付订单保留成交快照。取消、过期和改期分别处理占用释放与差额结算,退款退回原支付渠道,模拟支付宝退款不会增加会员余额。

会员账户不只是一个折扣标签

会员中心统一管理等级、有效期、余额、积分与账户流水。前台或管理员可以办理模拟收款储值,账户变更保留原因、经办人和关联业务。待支付订单的占用与可用余额分开显示,用户可核对储值、消费、退款及人工调整,而不是只看到一个余额数字。

平台还提供活动赛事报名、球友圈、公告和通知中心,使场馆系统同时覆盖交易、组织与社群触达,而不是停留在单一预约工具。

付款不是终点,商品交付也需要可追溯

商城结算前重新核对价格、库存与可用余额,支持储值余额和模拟支付宝。待付订单预留库存,付款成功后生成取货二维码与可读码;前台或管理员先查询订单,再确认整单交付。同一订单只能核销一次,退款申请期间冻结取货,退款成功后凭证失效。

BF 场馆商城购物车、实时核价提示与储值余额或模拟支付宝结算选项
购物车结算:展示余额、订单金额及两种支付渠道,下单前重新核价。截图未下单,背景中的测试商品与缺图占位按原状保留。
BF 前台查询已领取订单,显示核销经办人、领取时间与已取货状态
取货核销结果:该演示订单已于 9 月 24 日领取,保留经办人与时间。这不是可重复使用的取货凭证,也不表示已完成真实扫码设备验收。

同一份经营记录,不同角色各司其职

前台按完整时段原价为散客开场,无需先注册。例如 14:10 到店选择 14:00–15:00,仍支付整段费用并在 15:00 结束;相邻续场、收款和经办记录可追溯。前台不能发布赛事或公告,维修人员只读查看维护原因与时段,恢复开放由管理员确认。

BF 前台工作台的当日三场地排期与散客开场入口
前台排期:当日三片场地的空闲时段与开场入口,统一承接散客开场、续场、储值和取货。

把每一笔收款解释清楚,而不是只做收入总数

管理员在全局流水中区分渠道收款、储值充值、余额消费和退款,避免“充值 100 元再消费 100 元”被统计成 200 元渠道收款。预约结束不等于已到场:到场率与记录覆盖率分别披露,人工调整也不混入经营收入。

BF 管理员全业务交易流水,区分模拟渠道收款、余额消费、退款和人工调整
全局资金流水:渠道收退款与余额消费分开核对。人工调增含演示账户初始余额,不能解释为经营收入。
01
并发安全预约
场地行锁、事务复核、幂等与超时释放共同保护业务状态。
02
会员资金账本
储值、消费、退款和人工调整分别记录,并关联原业务与经办人。
03
一次性取货核销
付款后生成凭证,整单确认交付;退款冻结取货,阻止重复核销。
04
赛事与社区
支持赛事报名、球友内容、公告和站内通知。
05
运营统计
区分预订率、到场率与记录覆盖率,避免将未知到场误记为未到场。
06
可配置规则
营业时间、预约粒度、每日上限和超时策略均可调整。