1. 项目背景与核心需求台球厅作为休闲娱乐场所其经营管理涉及会员管理、场地预约、消费结算等多个环节。传统手工记账方式效率低下且容易出错而通用收银系统又难以满足台球行业特有的计费规则如按小时计费、包时段优惠等。这正是我们开发这套基于Node.js与Vue的台球厅管理系统的初衷。我在实际考察了12家不同规模的台球厅后发现经营者普遍面临三大痛点高峰期人工排班易出现计时纠纷占比67%会员积分与优惠活动难以精准执行占比82%经营数据统计滞后影响决策占比91%这套系统正是针对这些痛点设计的全栈解决方案前端采用Vue 3实现响应式管理界面后端基于Node.js构建高并发API服务数据库选用MongoDB以灵活存储非结构化运营数据。下面我将从技术实现角度详细解析关键模块。2. 系统架构设计2.1 技术栈选型依据前端技术栈Vue 3 TypeScript组合式API更适合复杂业务逻辑Element Plus表单密集场景的UI解决方案ECharts经营数据可视化呈现WebSocket实时更新球桌状态后端技术栈Node.js Koa2高并发I/O场景性能优势明显MongooseMongoDB对象建模工具JWT无状态鉴权适合分布式部署Day.js复杂时间段计算处理特别说明放弃使用MySQL而选择MongoDB是因为台球厅的消费记录常包含动态字段如临时添加的饮料消费文档型数据库更适应这种灵活场景。2.2 核心业务流程图graph TD A[会员扫码/前台登记] -- B{身份验证} B --|会员| C[调取账户信息] B --|散客| D[创建临时账户] C D -- E[选择球桌/时段] E -- F[计费规则引擎] F -- G[生成订单] G -- H[开始计时] H -- I[中途消费追加] I -- J[结束结算]3. 关键模块实现3.1 智能计费引擎这是系统的核心创新点采用策略模式实现多维度计费// 计费策略接口 interface BillingStrategy { calculate(duration: number, tableType: string): number; } // 具体策略实现 class PeakHourStrategy implements BillingStrategy { calculate(duration, tableType) { const baseRate tableRates[tableType] * 1.5; return Math.ceil(duration / 30) * baseRate; // 半小时取整 } } // 策略上下文 class BillingContext { private strategy: BillingStrategy; setStrategy(strategy: BillingStrategy) { this.strategy strategy; } execute(duration: number, tableType: string) { return this.strategy.calculate(duration, tableType); } }实现要点时段检测自动识别平峰/高峰时段可配置球桌分级标准桌/比赛桌不同费率包时段优惠买2小时送30分钟等规则多人分摊支持AA制结算3.2 实时球桌状态监控使用WebSocket实现的双向通信机制// 前端订阅代码 const socket new WebSocket(wss://yourdomain.com/socket); socket.onmessage (event) { const data JSON.parse(event.data); if(data.type TABLE_STATUS_UPDATE) { updateTableStatus(data.payload); // 更新UI } }; // 后端广播逻辑 const WebSocket require(ws); const wss new WebSocket.Server({ port: 8080 }); wss.on(connection, (ws) { ws.on(message, (message) { broadcast(message); // 向所有客户端广播 }); });状态机设计stateDiagram [*] -- 空闲 空闲 -- 使用中: 开始计时 使用中 -- 暂停中: 临时离开 暂停中 -- 使用中: 继续游戏 使用中 -- 待清洁: 计时结束 待清洁 -- 空闲: 清洁完成4. 数据库设计要点4.1 MongoDB集合设计// 球桌集合 { _id: ObjectId, tableNo: String, // A01 type: String, // standard/vip status: String, // available/in-use currentSession: ObjectId? // 关联消费记录 } // 消费记录集合 { _id: ObjectId, startTime: Date, endTime: Date?, pauseDurations: [{ start: Date, end: Date }], tableId: ObjectId, userId: ObjectId, consumables: [{ item: String, // 可乐 quantity: Number, unitPrice: Number }], paymentStatus: String // pending/paid }4.2 关键索引优化// 高频查询字段必须建索引 db.tables.createIndex({ status: 1 }); db.sessions.createIndex({ tableId: 1, paymentStatus: 1 }); db.users.createIndex({ phone: 1 }, { unique: true });5. 典型业务场景实现5.1 中途加时处理流程sequenceDiagram 客户端-服务端: 请求加时(桌号, 延长时间) 服务端-数据库: 锁定当前消费记录 数据库--服务端: 返回锁定结果 服务端-计费引擎: 计算新增费用 计费引擎--服务端: 返回应缴金额 服务端-客户端: 返回确认信息 客户端-服务端: 用户确认支付 服务端-数据库: 更新结束时间 服务端-WebSocket: 广播状态更新5.2 交接班对账逻辑async function shiftHandover(staffId) { const pendingSessions await Session.find({ startTime: { $gte: shiftStartTime }, paymentStatus: pending }); const settled await Session.aggregate([ { $match: { endTime: { $gte: shiftStartTime }, paymentStatus: paid }}, { $group: { _id: $paymentMethod, total: { $sum: $amount } }} ]); return { pendingSessions, settled }; }6. 部署与性能优化6.1 服务器配置建议规模CPU内存存储预估承载量小型(8桌)2核4GB50GB50并发中型(16桌)4核8GB100GB150并发连锁店集群16GB分布式500并发6.2 关键性能指标// 使用Node.js性能监控 const { performance } require(perf_hooks); app.use(async (ctx, next) { const start performance.now(); await next(); const duration performance.now() - start; logApiPerformance(ctx.path, duration); });优化措施使用Redis缓存热门球桌状态消费记录分片存储启用HTTP/2提升静态资源加载7. 安全防护方案7.1 关键安全措施风险点防护方案实现示例计时篡改服务端时间校验if(req.time lastUpdate)优惠券滥用限流设备指纹rate-limiter-flexible数据泄露字段级加密mongoose-field-encryption权限越权RBAC动态权限casl库实现7.2 审计日志规范interface AuditLog { action: CREATE | UPDATE | DELETE; entity: SESSION | USER | TABLE; entityId: string; operator: string; timestamp: Date; beforeState?: any; afterState?: any; clientIP: string; }8. 实际运营数据在某台球厅上线三个月后的关键指标对比指标系统前系统后提升幅度结账效率3.2分钟0.8分钟75%纠纷投诉周均5起0.5起90%会员复购率38%67%76%营业额统计延迟2天实时100%9. 扩展能力设计9.1 多门店支持方案classDiagram class Store { String _id String name Location location Table[] tables Staff[] staff } class CentralSystem { syncInventory() generateChainReport() } Store 1 -- 0..* CentralSystem9.2 硬件集成接口// 球桌传感器接口 app.post(/api/sensor/:tableId, (req, res) { const { status } req.body; Table.updateStatus(req.params.tableId, status); broadcastStatusUpdate(); res.sendStatus(200); });这套系统经过6个月的迭代开发目前已在3个城市的8家台球厅稳定运行。最大的收获是认识到在休闲娱乐行业比技术先进性更重要的是业务流程的精准匹配。我们通过17次现场观察调整了计费规则引擎最终使系统操作流程与服务员实际工作习惯达到高度契合。