MyWorkTime/server.js
2025-07-28 01:04:18 +08:00

105 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const express = require('express');
const cors = require('cors');
const fs = require('fs').promises;
const path = require('path');
const app = express();
const PORT = process.env.PORT || 3001;
const DATA_FILE = path.join(__dirname, 'user-data.json');
// 中间件
app.use(cors());
app.use(express.json({ limit: '10mb' }));
// 静态文件服务
app.use(express.static(path.join(__dirname, 'dist')));
// 确保数据文件存在
async function ensureDataFile() {
try {
await fs.access(DATA_FILE);
} catch {
// 文件不存在,创建空的数据结构
await fs.writeFile(DATA_FILE, JSON.stringify({
tasks: [],
projects: [],
lastUpdated: new Date().toISOString()
}));
}
}
// API路由
app.get('/api/data', async (req, res) => {
try {
await ensureDataFile();
const data = await fs.readFile(DATA_FILE, 'utf8');
const userData = JSON.parse(data);
res.json(userData);
} catch (error) {
console.error('获取数据失败:', error);
res.status(500).json({ error: '获取数据失败' });
}
});
app.post('/api/data', async (req, res) => {
try {
const { tasks, projects } = req.body;
// 验证数据格式
if (!Array.isArray(tasks) || !Array.isArray(projects)) {
return res.status(400).json({ error: '数据格式不正确' });
}
const userData = {
tasks,
projects,
lastUpdated: new Date().toISOString()
};
await fs.writeFile(DATA_FILE, JSON.stringify(userData, null, 2));
res.json({
success: true,
message: '数据保存成功',
lastUpdated: userData.lastUpdated
});
} catch (error) {
console.error('保存数据失败:', error);
res.status(500).json({ error: '保存数据失败' });
}
});
app.get('/api/last-updated', async (req, res) => {
try {
await ensureDataFile();
const data = await fs.readFile(DATA_FILE, 'utf8');
const userData = JSON.parse(data);
res.json({ lastUpdated: userData.lastUpdated });
} catch (error) {
console.error('获取更新时间失败:', error);
res.status(500).json({ error: '获取更新时间失败' });
}
});
app.get('/api/health', (req, res) => {
res.json({ status: 'ok', timestamp: new Date().toISOString() });
});
// 处理所有前端路由返回index.html
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 'dist', 'index.html'));
});
// 启动服务器
app.listen(PORT, () => {
console.log(`🚀 服务器运行在 http://localhost:${PORT}`);
console.log(`📱 前端应用: http://localhost:${PORT}`);
console.log(`🔧 API端点:`);
console.log(` GET /api/data - 获取用户数据`);
console.log(` POST /api/data - 保存用户数据`);
console.log(` GET /api/last-updated - 获取最后更新时间`);
console.log(` GET /api/health - 健康检查`);
console.log(`📊 健康检查: http://localhost:${PORT}/api/health`);
});
module.exports = app;