我来为您设计一个完整的酒吧服务器系统,涵盖从技术架构到具体实现的方案。
一、系统架构设计
前端应用层 (Web/移动端) → API网关 → 微服务集群 → 数据库/缓存
↑ ↑ ↑
WebSocket 负载均衡 消息队列后端: Node.js (Express/Nest.js) 或 Python (FastAPI/Django)
前端: React/Vue.js + 移动端 (React Native/Flutter)
数据库: PostgreSQL (主) + Redis (缓存)
实时通讯: Socket.IO 或 WebSocket
部署: Docker + Kubernetes 或 单机部署
二、核心功能模块
// 示例数据结构
const orderSchema = {
orderId: String, // 订单号
tableId: String, // 桌号
items: [{
itemId: String, // 商品ID
name: String, // 商品名
quantity: Number, // 数量
price: Number, // 单价
status: String // 状态: preparing/ready/served
}],
totalAmount: Number, // 总金额
status: String, // 订单状态
createdAt: Date,
paidAt: Date
};
库存管理示例
class InventoryService:
def update_stock(self, item_id, quantity_change):
# 更新库存,设置警报阈值
pass
def check_low_stock(self):
# 检查低库存商品
pass
def track_consumption(self, item_id, period):
# 跟踪商品消耗情况
pass
// WebSocket服务器示例
const io = require('socket.io')(server);
io.on('connection', (socket) => {
// 新订单通知
socket.on('new-order', (orderData) => {
// 推送到厨房显示屏
io.to('kitchen').emit('order-update', orderData);
// 推送到服务员设备
io.to('waiters').emit('new-order-alert', orderData);
});
// 订单状态更新
socket.on('order-status-change', (data) => {
io.emit('status-update', data);
});
});三、API设计示例
GET /api/menu # 获取菜单 POST /api/orders # 创建订单 GET /api/orders/:id # 获取订单详情 PUT /api/orders/:id # 更新订单 POST /api/payments # 支付处理 GET /api/inventory # 库存查询 POST /api/reservations # 预订管理 GET /api/reports/sales # 销售报表
// Express.js路由示例
router.post('/orders', async (req, res) => {
try {
const { tableId, items, customerInfo } = req.body;
// 验证库存
for (const item of items) {
const stock = await checkStock(item.itemId, item.quantity);
if (!stock.available) {
return res.status(400).json({ error:${item.name} 库存不足 });
}
}
// 创建订单
const order = await Order.create({
tableId,
items,
total: calculateTotal(items),
status: 'pending'
});
// 发送实时通知
io.emit('new-order', order);
res.json(order);
} catch (error) {
res.status(500).json({ error: error.message });
}
});四、数据库设计
-- 商品表 CREATE TABLE products ( id SERIAL PRIMARY KEY, name VARCHAR(100), category VARCHAR(50), -- 酒水/小吃/套餐 price DECIMAL(10,2), stock INTEGER, low_stock_threshold INTEGER, is_available BOOLEAN DEFAULT true ); -- 订单表 CREATE TABLE orders ( id SERIAL PRIMARY KEY, order_number VARCHAR(20) UNIQUE, table_id INTEGER REFERENCES tables(id), total_amount DECIMAL(10,2), status VARCHAR(20), created_at TIMESTAMP DEFAULT NOW(), paid_at TIMESTAMP ); -- 订单项表 CREATE TABLE order_items ( id SERIAL PRIMARY KEY, order_id INTEGER REFERENCES orders(id), product_id INTEGER REFERENCES products(id), quantity INTEGER, unit_price DECIMAL(10,2), note TEXT ); -- 员工表 CREATE TABLE staff ( id SERIAL PRIMARY KEY, username VARCHAR(50), password_hash VARCHAR(255), role VARCHAR(20), -- admin/waiter/bartender permissions JSONB );
五、部署配置
Dockerfile FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . EXPOSE 3000 CMD ["node", "server.js"]
docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/bar_db
- REDIS_URL=redis://redis:6379
depends_on:
- db
- redis
db:
image: postgres:15
environment:
- POSTGRES_DB=bar_db
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
nginx.conf
server {
listen 80;
server_name your-bar.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
# WebSocket支持
location /socket.io/ {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}六、完整实现示例
// server.js
const express = require('express');
const { createServer } = require('http');
const { Server } = require('socket.io');
const cors = require('cors');
const helmet = require('helmet');
const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, {
cors: {
origin: "*"
}
});
// 中间件
app.use(helmet());
app.use(cors());
app.use(express.json());
// 内存存储(生产环境用数据库)
let orders = [];
let products = [
{ id: 1, name: "啤酒", price: 25, stock: 100 },
{ id: 2, name: "鸡尾酒", price: 45, stock: 50 }
];
// REST API
app.get('/api/menu', (req, res) => {
res.json(products.filter(p => p.stock > 0));
});
app.post('/api/orders', (req, res) => {
const order = {
id: Date.now(),
...req.body,
status: 'pending',
createdAt: new Date()
};
orders.push(order);
// 实时通知
io.emit('new-order', order);
res.json(order);
});
// WebSocket事件
io.on('connection', (socket) => {
console.log('客户端连接');
socket.on('order-update', (data) => {
const index = orders.findIndex(o => o.id === data.id);
if (index !== -1) {
orders[index] = { ...orders[index], ...data };
io.emit('order-status-changed', orders[index]);
}
});
});
const PORT = process.env.PORT || 3000;
httpServer.listen(PORT, () => {
console.log(酒吧服务器运行在 http://localhost:${PORT});
});
// 前端连接WebSocket
const socket = io('http://localhost:3000');
// 监听新订单
socket.on('new-order', (order) => {
displayOrderNotification(order);
});
// 监听状态更新
socket.on('order-status-changed', (order) => {
updateOrderStatus(order.id, order.status);
});七、扩展功能建议
1、会员系统 - 积分、折扣、消费记录
2、智能推荐 - 基于历史消费推荐酒水
3、数据分析 - 销售热力图、高峰期预测
4、库存预警 - 自动补货提醒
5、多店管理 - 连锁酒吧支持
// 安全中间件示例
app.use(rateLimit({
windowMs: 15 * 60 * 1000, // 15分钟
max: 100 // 每个IP限制100个请求
}));
// JWT认证
app.use('/api/admin/*', authenticateToken);八、项目结构
bar-server/ ├── src/ │ ├── controllers/ # 控制器 │ ├── models/ # 数据模型 │ ├── routes/ # 路由定义 │ ├── services/ # 业务逻辑 │ ├── sockets/ # WebSocket处理 │ └── utils/ # 工具函数 ├── config/ # 配置文件 ├── tests/ # 测试文件 ├── package.json └── server.js # 入口文件
这个系统可以根据酒吧规模进行调整,对于小型酒吧,可以从简化版本开始;对于大型酒吧或连锁店,建议采用微服务架构,需要我详细说明某个部分吗?
文章摘自:https://idc.huochengrm.cn/fwq/24742.html
评论