You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

181 lines
5.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 导入必要的模块
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;