|
|
// 导入必要的模块
|
|
|
const express = require('express');
|
|
|
const cors = require('cors');
|
|
|
const dotenv = require('dotenv');
|
|
|
const path = require('path');
|
|
|
|
|
|
// 导入数据库配置
|
|
|
const { testConnection } = require('./config/database');
|
|
|
|
|
|
// 导入中间件
|
|
|
const { notFound, errorHandler } = require('./middleware/errorHandler');
|
|
|
|
|
|
// 导入响应工具
|
|
|
const { success } = require('./utils/response');
|
|
|
|
|
|
// 加载环境变量
|
|
|
dotenv.config();
|
|
|
|
|
|
// 创建Express应用
|
|
|
const app = express();
|
|
|
|
|
|
// ========================================
|
|
|
// 中间件配置
|
|
|
// ========================================
|
|
|
|
|
|
// CORS跨域配置(允许前端访问)
|
|
|
app.use(cors());
|
|
|
|
|
|
// 解析JSON格式的请求体
|
|
|
app.use(express.json());
|
|
|
|
|
|
// 解析URL编码的请求体
|
|
|
app.use(express.urlencoded({ extended: true }));
|
|
|
|
|
|
// 静态文件服务(用于访问上传的图片等)
|
|
|
app.use('/uploads', express.static(path.join(__dirname, 'uploads')));
|
|
|
|
|
|
// 请求日志中间件(开发环境)
|
|
|
if (process.env.NODE_ENV === 'development') {
|
|
|
app.use((req, res, next) => {
|
|
|
console.log(`📨 ${req.method} ${req.path}`);
|
|
|
next();
|
|
|
});
|
|
|
}
|
|
|
|
|
|
// ========================================
|
|
|
// 路由配置
|
|
|
// ========================================
|
|
|
|
|
|
// 根路由 - API欢迎信息
|
|
|
app.get('/', (req, res) => {
|
|
|
res.json(success({
|
|
|
name: '智能餐饮管理系统API',
|
|
|
version: '1.0.0',
|
|
|
description: '提供完整的餐厅管理功能',
|
|
|
status: 'running',
|
|
|
endpoints: {
|
|
|
auth: '/api/auth - 用户认证',
|
|
|
dishes: '/api/dishes - 菜品管理',
|
|
|
menus: '/api/menus - 菜单管理',
|
|
|
orders: '/api/orders - 订单管理',
|
|
|
inventory: '/api/inventory - 库存管理',
|
|
|
reservations: '/api/reservations - 预订管理',
|
|
|
members: '/api/members - 会员管理',
|
|
|
payments: '/api/payments - 支付结算',
|
|
|
analytics: '/api/analytics - 数据分析'
|
|
|
}
|
|
|
}, '欢迎使用智能餐饮管理系统'));
|
|
|
});
|
|
|
|
|
|
// 健康检查路由
|
|
|
app.get('/health', (req, res) => {
|
|
|
res.json(success({
|
|
|
status: 'OK',
|
|
|
timestamp: new Date(),
|
|
|
uptime: process.uptime(), // 服务器运行时间(秒)
|
|
|
environment: process.env.NODE_ENV || 'development'
|
|
|
}));
|
|
|
});
|
|
|
|
|
|
// API路由前缀
|
|
|
const API_PREFIX = '/api';
|
|
|
|
|
|
// 导入路由
|
|
|
const authRoutes = require('./routes/authRoutes');
|
|
|
const dishRoutes = require('./routes/dishRoutes');
|
|
|
const menuRoutes = require('./routes/menuRoutes');
|
|
|
const orderRoutes = require('./routes/orderRoutes');
|
|
|
const inventoryRoutes = require('./routes/inventoryRoutes');
|
|
|
const reservationRoutes = require('./routes/reservationRoutes');
|
|
|
const memberRoutes = require('./routes/memberRoutes');
|
|
|
const paymentRoutes = require('./routes/paymentRoutes');
|
|
|
const analyticsRoutes = require('./routes/analyticsRoutes');
|
|
|
|
|
|
// 注册路由
|
|
|
app.use(`${API_PREFIX}/auth`, authRoutes);
|
|
|
app.use(`${API_PREFIX}/dishes`, dishRoutes);
|
|
|
app.use(`${API_PREFIX}/menus`, menuRoutes);
|
|
|
app.use(`${API_PREFIX}/orders`, orderRoutes);
|
|
|
app.use(`${API_PREFIX}/inventory`, inventoryRoutes);
|
|
|
app.use(`${API_PREFIX}/reservations`, reservationRoutes);
|
|
|
app.use(`${API_PREFIX}/members`, memberRoutes);
|
|
|
app.use(`${API_PREFIX}/payments`, paymentRoutes);
|
|
|
app.use(`${API_PREFIX}/analytics`, analyticsRoutes);
|
|
|
|
|
|
// TODO: 后续将在这里引入其他功能模块的路由
|
|
|
// 例如:
|
|
|
// app.use(`${API_PREFIX}/orders`, orderRoutes);
|
|
|
// app.use(`${API_PREFIX}/reservations`, reservationRoutes);
|
|
|
|
|
|
// ========================================
|
|
|
// 错误处理
|
|
|
// ========================================
|
|
|
|
|
|
// 404错误处理(放在所有路由之后)
|
|
|
app.use(notFound);
|
|
|
|
|
|
// 全局错误处理中间件(必须放在最后)
|
|
|
app.use(errorHandler);
|
|
|
|
|
|
// ========================================
|
|
|
// 启动服务器
|
|
|
// ========================================
|
|
|
|
|
|
const PORT = process.env.PORT || 5000;
|
|
|
|
|
|
// 异步启动函数
|
|
|
const startServer = async () => {
|
|
|
try {
|
|
|
// 测试数据库连接
|
|
|
console.log('🔍 正在测试数据库连接...');
|
|
|
const dbConnected = await testConnection();
|
|
|
|
|
|
if (!dbConnected) {
|
|
|
console.error('❌ 数据库连接失败,服务器启动中止');
|
|
|
console.error('💡 请检查:');
|
|
|
console.error(' 1. MySQL是否已启动');
|
|
|
console.error(' 2. .env文件中的数据库配置是否正确');
|
|
|
console.error(' 3. 数据库restaurant_db是否已创建');
|
|
|
process.exit(1); // 退出程序
|
|
|
}
|
|
|
|
|
|
// 启动HTTP服务器
|
|
|
app.listen(PORT, () => {
|
|
|
console.log('╔══════════════════════════════════════════╗');
|
|
|
console.log('║ 智能餐饮管理系统 - 后端服务器已启动 ║');
|
|
|
console.log('╚══════════════════════════════════════════╝');
|
|
|
console.log(`🚀 服务器地址: http://localhost:${PORT}`);
|
|
|
console.log(`📝 环境模式: ${process.env.NODE_ENV || 'development'}`);
|
|
|
console.log(`💾 数据库: ${process.env.DB_NAME}`);
|
|
|
console.log('');
|
|
|
console.log('📡 可用的API端点:');
|
|
|
console.log(` GET / - API欢迎页面`);
|
|
|
console.log(` GET /health - 健康检查`);
|
|
|
console.log('');
|
|
|
console.log('⌨️ 按 Ctrl+C 停止服务器');
|
|
|
console.log('════════════════════════════════════════════');
|
|
|
});
|
|
|
} catch (error) {
|
|
|
console.error('❌ 服务器启动失败:', error.message);
|
|
|
process.exit(1);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
// 优雅关闭
|
|
|
process.on('SIGTERM', () => {
|
|
|
console.log('\n👋 收到SIGTERM信号,正在关闭服务器...');
|
|
|
process.exit(0);
|
|
|
});
|
|
|
|
|
|
process.on('SIGINT', () => {
|
|
|
console.log('\n👋 收到SIGINT信号,正在关闭服务器...');
|
|
|
process.exit(0);
|
|
|
});
|
|
|
|
|
|
// 启动服务器
|
|
|
startServer();
|
|
|
|
|
|
// 导出app供测试使用
|
|
|
module.exports = app;
|