From e55031f8ccfee8b970734c015dcc5b6f085fb995 Mon Sep 17 00:00:00 2001 From: zhang1106 <849185023@qq.com> Date: Tue, 10 Feb 2026 15:39:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=9C=BA=E6=9F=9C=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8D=A1=E7=89=87=E8=A7=86=E5=9B=BE=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E5=B9=B6=E4=BC=98=E5=8C=96=E5=90=8E=E7=AB=AF=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/routes/racks.js | 28 ++++++++++++++++++++++----- frontend/src/pages/RackManagement.jsx | 18 +++++++++++++++++ 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/backend/routes/racks.js b/backend/routes/racks.js index 7ca3e70..3190140 100644 --- a/backend/routes/racks.js +++ b/backend/routes/racks.js @@ -39,16 +39,34 @@ router.get('/', async (req, res) => { // 获取总记录数(带筛选条件) const total = await Rack.count({ where }); - // 获取分页数据 - 优化:使用 JOIN 避免 N+1 查询问题 + // 获取分页数据 - 先查询机柜基本信息 const racks = await Rack.findAll({ where, include: [ - { model: Room, separate: false }, - { model: Device, separate: false } + { model: Room, separate: false } ], limit: pageSize, - offset: offset, - subQuery: false // 避免子查询导致的性能问题 + offset: offset + }); + + // 单独查询每个机柜的设备信息(避免 JOIN 导致的数据重复问题) + const rackIds = racks.map(r => r.rackId); + const devices = await Device.findAll({ + where: { rackId: rackIds }, + attributes: ['deviceId', 'rackId', 'name', 'powerConsumption'] + }); + + // 将设备信息关联到对应的机柜 + const deviceMap = {}; + devices.forEach(d => { + if (!deviceMap[d.rackId]) { + deviceMap[d.rackId] = []; + } + deviceMap[d.rackId].push(d); + }); + + racks.forEach(rack => { + rack.dataValues.Devices = deviceMap[rack.rackId] || []; }); // 返回带分页信息的响应 diff --git a/frontend/src/pages/RackManagement.jsx b/frontend/src/pages/RackManagement.jsx index 528db84..66fbcd8 100644 --- a/frontend/src/pages/RackManagement.jsx +++ b/frontend/src/pages/RackManagement.jsx @@ -25,6 +25,7 @@ import { Statistic, Upload, Spin, + Pagination, } from 'antd'; import { PlusOutlined, @@ -947,6 +948,23 @@ function RackManagement() { )} )} + + {/* 卡片视图分页 - 始终显示当总数据大于0时 */} + {viewMode === 'card' && ( +