const express = require('express'); const path = require('path'); const fs = require('fs'); const yaml = require('js-yaml'); // 加载路由配置 function loadRoutes() { try { const fileContents = fs.readFileSync('routes.yaml', 'utf8'); return yaml.load(fileContents); } catch (e) { console.error('加载路由配置失败:', e); process.exit(1); } } const config = loadRoutes(); const app = express(); const PORT = config.server.port || 4155; // 静态文件服务 app.use('/css', express.static('css')); app.use('/js', express.static('js')); app.use('/data', express.static('data')); app.use('/order-classes', express.static('order-classes')); // 为每个订单班提供独立的静态文件服务 app.use('/order-class/wenlu/css', express.static('order-classes/wenlu/css')); app.use('/order-class/wenlu/js', express.static('order-classes/wenlu/js')); app.use('/order-class/wenlu/data', express.static('order-classes/wenlu/data')); // 由于HTML中使用相对路径,还需要从父路径提供静态文件 app.use('/order-class/css', express.static('order-classes/wenlu/css')); app.use('/order-class/js', express.static('order-classes/wenlu/js')); app.use('/order-class/data', express.static('order-classes/wenlu/data')); app.use('/order-class/food/css', express.static('order-classes/food/css')); app.use('/order-class/food/js', express.static('order-classes/food/js')); app.use('/order-class/food/data', express.static('order-classes/food/data')); // 日志中间件 app.use((req, res, next) => { console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`); next(); }); // 主路由 - 显示订单班选择页面 app.get('/', (req, res) => { const orderClass = req.query.class; if (orderClass) { // 如果指定了订单班,重定向到对应路由 res.redirect(`/order-class/${orderClass}`); } else { // 显示选择页面 res.send(generateIndexPage()); } }); // 处理 /order-class/*.html 形式的请求(wenlu 子页面)- 必须放在前面 app.get('/order-class/:page', (req, res, next) => { const page = req.params.page; // 只处理 .html 文件 if (!page.endsWith('.html')) { // 如果不是 .html 文件,继续下一个路由 next(); return; } const filePath = path.join(__dirname, 'order-classes', 'wenlu', page); if (fs.existsSync(filePath)) { let html = fs.readFileSync(filePath, 'utf8'); res.send(html); } else { res.status(404).send(generate404Page(page)); } }); // 订单班路由 app.get('/order-class/:className', (req, res) => { const className = req.params.className; const classConfig = config.order_classes[className]; if (!classConfig) { res.status(404).send(generate404Page(className)); return; } // 如果订单班已完成,返回其页面 if (classConfig.status === 'completed') { const filePath = path.join(__dirname, classConfig.path, classConfig.entry); if (fs.existsSync(filePath)) { // 读取文件并修改相对路径 let html = fs.readFileSync(filePath, 'utf8'); // 保持相对路径,让浏览器自己解析 // 不需要修改路径,因为我们已经设置了静态文件服务 res.send(html); } else { res.send(generateComingSoonPage(classConfig)); } } else { res.send(generateComingSoonPage(classConfig)); } }); // 处理订单班内部页面(如文旅的overview.html等) app.get('/order-classes/:className/:page', (req, res) => { const { className, page } = req.params; const filePath = path.join(__dirname, 'order-classes', className, page); if (fs.existsSync(filePath)) { let html = fs.readFileSync(filePath, 'utf8'); // 保持相对路径不变 res.send(html); } else { res.status(404).send(generate404Page(`${className}/${page}`)); } }); // 已删除 /order-class/pages/:page 路由,因为导航链接已修复为相对路径 // 生成首页(选择页面) function generateIndexPage() { const orderClasses = Object.entries(config.order_classes); const completedClasses = orderClasses.filter(([_, c]) => c.status === 'completed'); const pendingClasses = orderClasses.filter(([_, c]) => c.status === 'pending'); return `
基于多Agent协作的智能方案生成平台
${config.description}
${config.description}
${classConfig.title}
${classConfig.description}
🚀 正在开发中
我们的AI专家团队正在为您准备专业的解决方案