二、安装必要的组建和配置sql

项目结构回顾

backend/
│
├── src/
│   ├── db/
│   │   ├── config.js       // 数据库配置
│   │   ├── connection.js   // 数据库连接管理
│   │
│   ├── routes/
│   │   ├── api.js          // API 路由定义
│   │
│   ├── app.js              // 后端服务入口文件
│
├── package.json            // 后端依赖配置
└── ...

后端结构

  1. 数据库配置:使用 src/db/config.js 配置数据库。
  2. 数据库连接:通过 src/db/connection.js 管理数据库连接。
  3. 后端服务入口app.js 将作为后端的服务启动文件。
  4. 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

安装组建

  1. 安装依赖: 运行以下命令来安装 express 以及其他依赖:

    npm install express cors mysql2
    

    这将安装 expresscors(用于跨域支持)和 mysql2(用于连接 MySQL 数据库)这几个依赖。

  2. 确认安装完成后,启动服务: 安装完成后,运行启动命令:

    npm start
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值