简并绘制

This commit is contained in:
satori 2024-12-07 06:53:37 +08:00
parent e0d62e76b1
commit 7937a902c7
3 changed files with 44 additions and 54 deletions

92
main.js
View File

@ -1,64 +1,49 @@
import Chart from 'chart.js/auto'
import { createElement, div, table, thead, tbody, tr, th, td } from '@laniakeasupercluster/widgets'
const rest = await fetch('http://localhost:2000/api').then(res => res.json())
const table = document.createElement('table')
document.body.appendChild(div.childs([
div.text('航班信息'),
table.childs([
thead.childs([
tr.childs([
th.text('ID'),
th.text('航班号'),
th.text('航空公司'),
th.text('起飞机场'),
th.text('到达机场'),
th.text('数据')
])
]),
tbody.childs(
rest.map(row => tr.childs([
td.text(row.flight_id),
td.text(row.flight_number),
td.text(row.airline),
td.text(row.origin),
td.text(row.destination),
td.text(row.shuju)
]))
)
])
]))
// 添加表头
const thead = document.createElement('thead')
const tr = document.createElement('tr')
for (let key in rest[0]) {
const th = document.createElement('th')
th.textContent = key
tr.appendChild(th)
}
thead.appendChild(tr)
table.appendChild(thead)
// 添加数据
for (let row of rest) {
const tr = document.createElement('tr')
for (let key in row) {
const td = document.createElement('td')
td.textContent = row[key]
tr.appendChild(td)
}
table.appendChild(tr)
}
// 写入页面
document.body.appendChild(table)
// 生成随机数据
function generateRandomData(num, minPrice, maxPrice) {
const data = [];
const today = new Date();
for (let i = 0; i < num; i++) {
const randomDays = Math.floor(Math.random() * 30); // 随机天数
const newDate = new Date(today.getTime() + randomDays * 24 * 60 * 60 * 1000); // 增加随机天数
const price = Math.floor(Math.random() * (maxPrice - minPrice + 1)) + minPrice; // 随机价格
data.push({
date: newDate.toISOString().split('T')[0], // 格式化为 YYYY-MM-DD
price: price
});
}
return data;
}
// 生成 10 条随机数据
const numEntries = 10;
const data = generateRandomData(numEntries, 100, 500);
const metrics = await fetch('http://localhost:2000/api/metrics').then(res => res.json())
// 创建图表
const ctx = document.createElement('canvas');
document.body.appendChild(ctx);
new Chart(ctx, {
const context = createElement({
width: 800,
height: 200,
}, 'canvas')
document.body.appendChild(context)
new Chart(context, {
type: 'line',
data: {
labels: data.map(row => row.date),
labels: metrics.map(row => new Date(row.date).toLocaleDateString()), // 显示日期
datasets: [{
label: '航班价格',
data: data.map(row => row.price),
label: '航班数量',
data: metrics.map(row => row.count), // 使用 count 作为数据
backgroundColor: 'rgba(255, 99, 132, 0.2)', // 曲线下方填充颜色透明度0.2
borderColor: 'rgba(255, 99, 132, 1)', // 曲线颜色
borderWidth: 2, // 曲线宽度
@ -73,5 +58,4 @@ new Chart(ctx, {
}
}
}
});
})

View File

@ -10,6 +10,7 @@
"author": "",
"license": "ISC",
"dependencies": {
"@laniakeasupercluster/widgets": "^1.1.5",
"chart.js": "^4.4.7",
"cors": "^2.8.5",
"express": "^4.21.2",

View File

@ -26,6 +26,11 @@ app.get('/api', async (req, res) => {
res.json(rows)
})
app.get('/api/metrics', async (req, res) => {
const [rows] = await db.query('SELECT date, COUNT(*) AS count FROM flight_price_history GROUP BY date')
res.json(rows)
})
// 启动应用
app.listen(2000, () => {
console.log('服务已启动成功 http://localhost:2000/api')