更新项目文件结构,统一文档风格

This commit is contained in:
ylweng
2025-09-04 01:39:31 +08:00
parent 216cf80eab
commit 3ae7b4db8c
45 changed files with 17218 additions and 642 deletions

View File

@@ -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 = [