去年帮本地一家台球厅升级管理系统时,我基于Python生态的Flask+Django混合架构开发了一套开台计费系统。这种混合架构既能利用Django的ORM和Admin快速搭建后台,又能通过Flask的灵活性实现定制化前端交互。系统上线后,老板反馈每月人工统计时长的工作量减少了80%,错单率从15%降到3%以下。
传统台球厅管理普遍存在几个痛点:手工记录开台时间易出错、不同时段费率计算复杂、交接班对账困难。这套系统核心要解决的就是这三个问题,同时需要兼顾收银员的操作效率和老板的数据可视化需求。
Django的全家桶优势在后台管理场景非常明显:
但纯Django模板在前端交互上比较笨重,因此我在用户端采用Flask+Jinja2:
核心表结构设计考虑了台球厅的特殊业务场景:
python复制class BilliardTable(models.Model):
STATUS_CHOICES = [
('free', '空闲'),
('in_use', '使用中'),
('maintenance', '维修中')
]
number = models.CharField(max_length=10, unique=True)
status = models.CharField(max_length=20, choices=STATUS_CHOICES)
hourly_rate = models.DecimalField(max_digits=6, decimal_places=2)
class Session(models.Model):
table = models.ForeignKey(BilliardTable, on_delete=models.PROTECT)
start_time = models.DateTimeField(auto_now_add=True)
end_time = models.DateTimeField(null=True)
total_amount = models.DecimalField(max_digits=10, decimal_places=2)
is_paid = models.BooleanField(default=False)
特别注意:
台球厅常有分时段计价需求,比如:
在models.py中定义计费规则:
python复制def calculate_amount(start, end, is_member=False):
weekday = start.weekday()
base_rate = 100 if weekday >= 5 or start.hour >= 18 else 80
duration = (end - start).total_seconds() / 3600
amount = base_rate * duration
return amount * 0.8 if is_member else amount
重要提示:实际业务中建议将费率配置抽离到数据库,避免硬编码
前端采用Vue.js实现动态刷新,关键代码:
javascript复制// 每10秒刷新一次剩余时间
setInterval(() => {
axios.get('/api/session/remaining')
.then(response => {
this.remaining = response.data.remaining
this.amount = response.data.amount
})
}, 10000)
后端接口示例:
python复制@app.route('/api/session/remaining')
def get_remaining():
session = Session.objects.filter(end_time__isnull=True).first()
if session:
elapsed = datetime.now() - session.start_time
return jsonify({
'remaining': str(elapsed),
'amount': calculate_amount(session.start_time, datetime.now())
})
采用Docker Compose编排服务:
yaml复制version: '3'
services:
web:
build: .
command: gunicorn -w 4 -b :8000 main:app
volumes:
- .:/code
ports:
- "8000:8000"
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
台球厅高峰时段可能同时有几十张台子频繁更新状态,我们做了这些优化:
系统上线后我们发现几个常见操作问题:
经过实测推荐这些外设:
这套系统经过三个月的迭代,目前已经稳定运行一年多。最大的收获是认识到:即使是看似简单的台球厅管理,在计费规则、状态管理和硬件集成等方面都有很多细节需要考虑。后续计划加入手机预约和智能灯控功能,进一步提升运营效率。