更新项目文件结构,统一文档风格
This commit is contained in:
@@ -3,13 +3,67 @@ const cors = require('cors');
|
||||
const helmet = require('helmet');
|
||||
const dotenv = require('dotenv');
|
||||
const rateLimit = require('express-rate-limit');
|
||||
const mysql = require('mysql2/promise');
|
||||
const path = require('path');
|
||||
|
||||
// 导入路由模块
|
||||
const authModule = require('./routes/auth');
|
||||
const usersModule = require('./routes/users');
|
||||
const cattleModule = require('./routes/cattle');
|
||||
const financeModule = require('./routes/finance');
|
||||
const tradingModule = require('./routes/trading');
|
||||
const governmentModule = require('./routes/government');
|
||||
const mallModule = require('./routes/mall');
|
||||
|
||||
// 加载环境变量
|
||||
dotenv.config();
|
||||
|
||||
// 数据库连接配置
|
||||
const dbConfig = {
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME,
|
||||
charset: process.env.DB_CHARSET || 'utf8mb4',
|
||||
connectionLimit: 10,
|
||||
acquireTimeout: 60000,
|
||||
timeout: 60000
|
||||
};
|
||||
|
||||
// 创建数据库连接池
|
||||
const pool = mysql.createPool(dbConfig);
|
||||
|
||||
// 测试数据库连接
|
||||
async function testDatabaseConnection() {
|
||||
try {
|
||||
const connection = await pool.getConnection();
|
||||
console.log('✅ 数据库连接成功');
|
||||
console.log(`📍 连接到: ${process.env.DB_HOST}:${process.env.DB_PORT}/${process.env.DB_NAME}`);
|
||||
connection.release();
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error('❌ 数据库连接失败:', error.message);
|
||||
console.log('⚠️ 服务将继续运行,但数据库功能不可用');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// 启动时测试数据库连接(不阻塞服务启动)
|
||||
testDatabaseConnection();
|
||||
|
||||
// 创建Express应用
|
||||
const app = express();
|
||||
const PORT = process.env.PORT || 8000;
|
||||
const PORT = process.env.PORT || 8888;
|
||||
|
||||
// 设置路由模块的数据库连接
|
||||
authModule.setPool(pool);
|
||||
usersModule.setMiddleware(authModule.authenticateToken, authModule.checkPermission, pool);
|
||||
cattleModule.setMiddleware(authModule.authenticateToken, authModule.checkPermission, pool);
|
||||
financeModule.setMiddleware(authModule.authenticateToken, authModule.checkPermission, pool);
|
||||
tradingModule.setMiddleware(authModule.authenticateToken, authModule.checkPermission, pool);
|
||||
governmentModule.setMiddleware(authModule.authenticateToken, authModule.checkPermission, pool);
|
||||
mallModule.setMiddleware(authModule.authenticateToken, authModule.checkPermission, pool);
|
||||
|
||||
// 中间件
|
||||
app.use(helmet()); // 安全头部
|
||||
@@ -34,14 +88,91 @@ app.get('/', (req, res) => {
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/health', (req, res) => {
|
||||
res.json({
|
||||
status: 'OK',
|
||||
timestamp: new Date().toISOString()
|
||||
});
|
||||
app.get('/health', async (req, res) => {
|
||||
try {
|
||||
// 测试数据库连接
|
||||
const connection = await pool.getConnection();
|
||||
const [rows] = await connection.execute('SELECT 1 as test');
|
||||
connection.release();
|
||||
|
||||
res.json({
|
||||
status: 'OK',
|
||||
timestamp: new Date().toISOString(),
|
||||
database: 'Connected',
|
||||
environment: process.env.NODE_ENV,
|
||||
version: '1.0.0'
|
||||
});
|
||||
} catch (error) {
|
||||
res.status(500).json({
|
||||
status: 'ERROR',
|
||||
timestamp: new Date().toISOString(),
|
||||
database: 'Disconnected',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 大屏可视化地图数据接口
|
||||
// API路由
|
||||
app.use('/api/v1/auth', authModule.router);
|
||||
app.use('/api/v1/users', usersModule.router);
|
||||
app.use('/api/v1/cattle', cattleModule.router);
|
||||
app.use('/api/v1/finance', financeModule.router);
|
||||
app.use('/api/v1/trading', tradingModule.router);
|
||||
app.use('/api/v1/government', governmentModule.router);
|
||||
app.use('/api/v1/mall', mallModule.router);
|
||||
|
||||
// 数据库查询接口
|
||||
app.get('/api/v1/database/tables', async (req, res) => {
|
||||
try {
|
||||
const [tables] = await pool.execute(
|
||||
'SELECT TABLE_NAME, TABLE_COMMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = ?',
|
||||
[process.env.DB_NAME]
|
||||
);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
database: process.env.DB_NAME,
|
||||
tables: tables,
|
||||
count: tables.length
|
||||
},
|
||||
timestamp: new Date().toISOString()
|
||||
});
|
||||
} catch (error) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message,
|
||||
timestamp: new Date().toISOString()
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 数据库连接状态接口
|
||||
app.get('/api/v1/database/status', async (req, res) => {
|
||||
try {
|
||||
const [statusResult] = await pool.execute('SHOW STATUS LIKE "Threads_connected"');
|
||||
const [versionResult] = await pool.execute('SELECT VERSION() as version');
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
connected: true,
|
||||
version: versionResult[0].version,
|
||||
threads_connected: statusResult[0].Value,
|
||||
database: process.env.DB_NAME,
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT
|
||||
},
|
||||
timestamp: new Date().toISOString()
|
||||
});
|
||||
} catch (error) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message,
|
||||
timestamp: new Date().toISOString()
|
||||
});
|
||||
}
|
||||
});
|
||||
app.get('/api/v1/dashboard/map/regions', (req, res) => {
|
||||
// 模拟锡林郭勒盟各区域数据
|
||||
const regions = [
|
||||
|
||||
Reference in New Issue
Block a user