项目结构回顾
backend/
│
├── src/
│ ├── db/
│ │ ├── config.js // 数据库配置
│ │ ├── connection.js // 数据库连接管理
│ │
│ ├── routes/
│ │ ├── api.js // API 路由定义
│ │
│ ├── app.js // 后端服务入口文件
│
├── package.json // 后端依赖配置
└── ...
后端结构
- 数据库配置:使用
src/db/config.js
配置数据库。 - 数据库连接:通过
src/db/connection.js
管理数据库连接。 - 后端服务入口:
app.js
将作为后端的服务启动文件。 - API 路由:
src/routes/api.js
用于管理前端请求的 API。
1.数据库配置 (config.js
)
config.js
保持不变,仍然用于存储数据库的连接信息:
// src/db/config.js
module.exports = {
host: 'localhost',
user: 'root',
password: 'yourpassword', // 修改为你的数据库密码
database: 'yourdatabase', // 修改为你的数据库名
port: 3306, // 如果数据库使用默认端口
};
2. 数据库连接管理 (connection.js
)
connection.js
用于处理数据库连接和池化操作,代码如下:
// src/db/connection.js
const mysql = require('mysql2');
const config = require('./config');
// 创建连接池
const pool = mysql.createPool({
host: config.host,
user: config.user,
password: config.password,
database: config.database,
port: config.port,
connectionLimit: 10, // 设置连接池的最大连接数
});
// 导出连接池
module.exports = pool.promise();
utils/dbHelpers.js配置
// src/utils/dbHelpers.js
const db = require('../db/connection'); // 正确引入数据库连接模块
// 禁用 MySQL 的 ONLY_FULL_GROUP_BY 模式
async function disableFullGroupBy() {
const disableFullGroupByQuery = `
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
`;
await db.query(disableFullGroupByQuery);
}
module.exports = {
disableFullGroupBy
};
3. API 路由 (dayaheadPricesForK.js
)
dayaheadPricesForK
.js
用于定义不同的路由。以下是查询数据库并返回数据的例子:
// src/routes/dayaheadPricesForK.js
const express = require('express');
const router = express.Router();
const db = require('../db/connection');
const dbHelpers = require('../utils/dbHelpers'); // 引入 dbHelpers.js
// 获取电价数据:计算每天的第一个时间点、最后一个时间点的价格,最高价和最低价
router.get('/', async (req, res) => {
try {
// 获取查询参数:时间范围
const { startDate, endDate } = req.query;
// 禁用 ONLY_FULL_GROUP_BY 模式
await dbHelpers.disableFullGroupBy();
// 如果没有提供时间范围参数,则默认为过去12个月
const whereClause = startDate && endDate
? `WHERE p.usage_date BETWEEN '${startDate}' AND '${endDate}'`
: `WHERE p.usage_date >= CURDATE() - INTERVAL 12 MONTH`;
// 执行数据库查询:查询每天的第一个时间点价格、最后一个时间点价格,最高价和最低价
const query = `
SELECT
DATE(p.usage_date) AS date,
-- 获取每天的最早时间点的价格
(SELECT dayahead_price
FROM power_sd_prices
WHERE usage_date = p.usage_date
ORDER BY time_slot ASC LIMIT 1) AS first_price,
-- 获取每天的最后时间点的价格
(SELECT dayahead_price
FROM power_sd_prices
WHERE usage_date = p.usage_date
ORDER BY time_slot DESC LIMIT 1) AS last_price,
-- 获取每天的最高价格
MAX(p.dayahead_price) AS highest_price,
-- 获取每天的最低价格
MIN(p.dayahead_price) AS lowest_price
FROM
power_sd_prices p
${whereClause} -- 根据时间范围过滤数据
GROUP BY
DATE(p.usage_date)
ORDER BY
DATE(p.usage_date) DESC;
`;
const [rows] = await db.query(query);
// 将查询结果格式化为符合 K 线图的数据结构
const formattedData = rows.map(item => {
const date = new Date(item.date);
const formattedDate = `${date.getFullYear()}/${(date.getMonth() + 1).toString().padStart(2, '0')}/${date.getDate().toString().padStart(2, '0')}`;
return [
formattedDate, // 日期格式化为 "YYYY/MM/DD"
parseFloat(item.first_price), // 开盘价
parseFloat(item.last_price), // 收盘价
parseFloat(item.lowest_price), // 最低价
parseFloat(item.highest_price) // 最高价
];
});
// 返回数据,格式为 splitData([...])
res.json({ data: formattedData });
} catch (err) {
console.error('Error executing query: ', err);
res.status(500).send('数据库查询失败');
}
});
module.exports = router;
4. 后端服务入口 (app.js
)
app.js
是后端应用的入口文件,在这个文件中我们创建 Express 服务并连接路由:
// src/app.js
const express = require('express');
const cors = require('cors'); // 跨域支持
const dayaheadPricesRoutes = require('./routes/dayaheadPricesForK'); // 引入日内电价K路由
const realtimePricesRoutes = require('./routes/realtimePricesForK'); // 引入实时电价K路由
const app = express();
// 使用跨域中间件
app.use(cors());
// 配置 JSON 请求体解析
app.use(express.json());
// 使用不同功能的路由
app.use('/api/kchart-dayahead', dayaheadPricesRoutes); // 将日内电价的路由挂载到 /api/dayahead
app.use('/api/realtime', realtimePricesRoutes); // 将实时电价的路由挂载到 /api/realtime
// 启动服务
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`Server running on http://localhost:${port}`);
});
5. 启动后端服务
在 backend/package.json
中,你可以添加一个启动脚本,便于快速启动服务:
{
"scripts": {
"start": "node src/app.js"
}
}
然后,在 backend
目录中运行以下命令启动后端服务:
npm start
安装组建
-
安装依赖: 运行以下命令来安装
express
以及其他依赖:npm install express cors mysql2
这将安装
express
、cors
(用于跨域支持)和mysql2
(用于连接 MySQL 数据库)这几个依赖。 -
确认安装完成后,启动服务: 安装完成后,运行启动命令:
npm start