-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathserver.js
More file actions
111 lines (93 loc) · 3.09 KB
/
server.js
File metadata and controls
111 lines (93 loc) · 3.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import express from 'express';
import cron from 'node-cron';
import path from 'path';
import fs from 'fs';
import { fileURLToPath } from 'url';
import { initDatabase, getDb } from './database.js';
import { scrapeTargetRoom } from './scraper.js';
const app = express();
const port = process.env.PORT || 8080;
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// 环境变量检查
if (!process.env.ROOM_ID) {
console.warn("⚠️ WARNING: ROOM_ID is not set!");
}
app.use(express.json());
await initDatabase();
// --- 辅助函数:生成显示名称 ---
function getRoomDisplayName() {
const roomId = process.env.ROOM_ID || 'Unset';
const buildId = process.env.BUILD_ID;
let partId = process.env.PART_ID; // 支持 "0", "1", "奉贤", "徐汇"
if (!buildId || !partId) {
return `Room ${roomId}`;
}
// 统一校区名称
let campus = "";
if (partId === '0' || partId === '奉贤') campus = "奉贤";
else if (partId === '1' || partId === '徐汇') campus = "徐汇";
else campus = partId; // 如果用户填了其他字符串,直接显示
// 格式化楼栋名 (如果用户没填"号楼"且不是特殊名,看起来像数字,就补上"号楼")
let buildDisplay = buildId;
if (/^\d+$/.test(buildId)) {
buildDisplay = `${buildId}号楼`;
}
// 最终格式:徐汇-18号楼-507
return `${campus}-${buildDisplay}-${roomId}`;
}
// --- API 接口 ---
app.get('/api/config', (req, res) => {
res.json({
roomId: process.env.ROOM_ID || null,
displayName: getRoomDisplayName(),
version: 'Docker-v2.0-AutoBuild'
});
});
app.get('/api/data', async (req, res) => {
try {
const db = await getDb();
const targetRoom = process.env.ROOM_ID;
let query = "SELECT * FROM electricity WHERE timestamp > datetime('now', '-30 days')";
const params = [];
if (targetRoom) {
query += " AND room_id = ?";
params.push(targetRoom);
}
query += " ORDER BY timestamp ASC";
const results = await db.all(query, params);
res.json(results);
} catch (e) {
console.error("Database error:", e);
res.status(500).json({ error: e.message });
}
});
app.use(express.static(path.join(__dirname, 'dist')));
app.get('*', (req, res) => {
if (!req.path.startsWith('/api')) {
const indexFile = path.join(__dirname, 'dist', 'index.html');
if (fs.existsSync(indexFile)) {
res.sendFile(indexFile);
} else {
res.type('text/html');
res.send('<h1>Nakiri Electricity</h1><p>Frontend building...</p>');
}
}
});
cron.schedule('0 * * * *', async () => {
console.log(`[${new Date().toISOString()}] Cron job running...`);
await scrapeTargetRoom();
});
app.listen(port, '0.0.0.0', async () => {
console.log(`
🚀 Nakiri Electricity is running!
---------------------------------------
Port: ${port}
Room: ${getRoomDisplayName()}
---------------------------------------
`);
if (process.env.ROOM_ID) {
console.log('Initializing data scrape on startup...');
await scrapeTargetRoom();
}
});