ThingsPanel v1.2.4:让物联网看板嵌入业务页面后不再“露半截”

2026-07-06 35 预计阅读时间: 1 分钟
来源: oschina.net AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:10 分钟

ThingsPanel 物联网平台 v1.2.4 的更新重点很务实:不是增加一个炫目的新概念,而是把业务系统里最常见、也最容易让人烦躁的看板嵌入问题继续打磨。看板放进业务页面后高度不合适、内容被截断、滚动条互相打架、图表细节不够清楚,这些问题在 IoT 场景里会直接影响值班、巡检和运营判断。

这次版本围绕看板显示稳定性、嵌入自适应能力、图表展示细节和平台兼容性展开。对已经把 ThingsPanel 作为设备监控、能耗分析、告警展示入口的团队来说,v1.2.4 更像是一次“把看板真正放进生产页面”的体验修正。

看板嵌入的问题,通常不是 iframe 这么简单

很多物联网平台的看板最终都会被嵌入到企业门户、运维系统、工单系统或客户大屏中。技术上看,嵌入一个页面似乎只要一行 iframe

<iframe src="https://thingspanel.example.com/dashboard/xxx"></iframe>

但实际运行时会遇到几个硬问题:

  • 父页面不知道子页面真实高度,结果 iframe 太矮,底部图表被截断。
  • iframe 自己滚动,外层业务页面也滚动,用户滚几下就丢失上下文。
  • 看板图表尺寸依赖容器宽高,嵌入后如果 resize 触发不稳定,图表会出现空白、压缩或展示不完整。
  • 不同浏览器、不同后台布局、不同屏幕密度下,细节表现不一致。

v1.2.4 聚焦的“嵌入自适应能力”和“显示稳定性”,正是这些生产场景里的痛点。对开发者来说,升级价值不只是页面更顺眼,而是减少业务系统集成时的补丁代码和临时 CSS。

图表细节是 IoT 看板的有效信息密度

物联网看板和普通管理后台表格不同,它的关键价值在于连续数据和现场状态:温度曲线、压力波动、电流峰值、设备在线率、告警趋势,都需要在有限空间里准确呈现。

如果图表显示“不够细”,问题往往不只是视觉层面。比如:

  • 折线过粗,异常尖峰被视觉上抹平。
  • 坐标轴标签拥挤,值班人员需要猜测时间点。
  • tooltip 信息不足,排查人员无法快速定位设备和指标。
  • 嵌入后图表高度被压缩,趋势判断变得困难。

因此,v1.2.4 对图表展示细节的优化,应该放到“降低误判成本”的角度看。IoT 系统里,少看清一次峰值,可能就意味着晚处理一次设备异常。

可以这样实践:给嵌入看板加一层自适应高度协议

下面是一个可改造的最小示例,用于业务系统中嵌入 ThingsPanel 看板时处理高度自适应。它不声称是 ThingsPanel v1.2.4 的内置 API,只是一个通用实践:如果看板页面和业务页面都在你的控制范围内,可以通过 postMessage 让子页面把内容高度发给父页面。

需要改的地方:

  • DASHBOARD_URL 换成你的 ThingsPanel 看板地址。
  • ALLOWED_ORIGIN 换成 ThingsPanel 所在域名。
  • 如果跨域嵌入受限,需要同时检查平台的 iframe 安全策略、反向代理头和登录态策略。

父页面示例:

<!doctype html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>业务系统中的 ThingsPanel 看板</title>
  <style>
    body {
      margin: 0;
      font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      background: #f6f7f9;
    }

    .page-header {
      height: 56px;
      display: flex;
      align-items: center;
      padding: 0 20px;
      background: #ffffff;
      border-bottom: 1px solid #e5e7eb;
      font-weight: 600;
    }

    .dashboard-frame {
      width: 100%;
      min-height: calc(100vh - 56px);
      border: 0;
      display: block;
      background: #ffffff;
    }
  </style>
</head>
<body>
  <header class="page-header">设备运行总览</header>

  <iframe
    id="thingspanel-dashboard"
    class="dashboard-frame"
    src="https://thingspanel.example.com/dashboard/demo"
    title="ThingsPanel Dashboard"
  ></iframe>

  <script>
    const ALLOWED_ORIGIN = "https://thingspanel.example.com";
    const frame = document.getElementById("thingspanel-dashboard");

    window.addEventListener("message", (event) => {
      if (event.origin !== ALLOWED_ORIGIN) return;
      if (!event.data || event.data.type !== "thingspanel:resize") return;

      const nextHeight = Number(event.data.height);
      if (!Number.isFinite(nextHeight)) return;

      frame.style.height = `${Math.max(nextHeight, window.innerHeight - 56)}px`;
    });
  </script>
</body>
</html>

如果你能在被嵌入的看板页面中加入脚本,可以这样发送高度变化:

<script>
  function notifyParentHeight() {
    const height = Math.max(
      document.documentElement.scrollHeight,
      document.body.scrollHeight
    );

    window.parent.postMessage(
      { type: "thingspanel:resize", height },
      "https://business.example.com"
    );
  }

  window.addEventListener("load", notifyParentHeight);
  window.addEventListener("resize", notifyParentHeight);

  const observer = new ResizeObserver(notifyParentHeight);
  observer.observe(document.documentElement);
</script>

这个方案的关键点是:父页面只信任指定来源,子页面只向指定业务域发送消息。不要在生产环境里把 postMessage 的目标域写成 *,也不要接受任意来源的 resize 消息,否则会留下页面操控风险。

部署前可以重点验证这几项

升级到 v1.2.4 后,建议不要只在平台内部打开看板看一眼。真正的验证应该覆盖“业务页面中的看板”。可以按下面清单跑一遍:

# 1. 在桌面浏览器中检查嵌入页是否出现双滚动条
# 2. 切换 1366x768、1920x1080、移动端宽度,观察图表是否被截断
# 3. 打开包含多张图表的看板,确认页面加载后高度能稳定下来
# 4. 模拟数据刷新,观察图表 resize 后是否出现空白或重叠
# 5. 在目标浏览器中验证登录态、跨域策略和 iframe 加载策略

如果团队有 Playwright,也可以给嵌入页补一个简单的视觉冒烟测试。下面示例假设你的业务嵌入页地址是 http://localhost:3000/iot-dashboard

npm init -y
npm install -D @playwright/test
npx playwright install chromium
// dashboard.spec.js
const { test, expect } = require("@playwright/test");

test("embedded ThingsPanel dashboard is visible and scrollable", async ({ page }) => {
  await page.goto("http://localhost:3000/iot-dashboard");

  const frame = page.locator("iframe[title='ThingsPanel Dashboard']");
  await expect(frame).toBeVisible();

  const box = await frame.boundingBox();
  expect(box.height).toBeGreaterThan(500);

  const hasDoubleScrollbar = await page.evaluate(() => {
    const pageScrollable = document.documentElement.scrollHeight > window.innerHeight;
    const iframe = document.querySelector("iframe[title='ThingsPanel Dashboard']");
    return pageScrollable && iframe && iframe.clientHeight < iframe.scrollHeight;
  });

  expect(hasDoubleScrollbar).toBeFalsy();
});

运行:

npx playwright test dashboard.spec.js

这类测试不需要覆盖所有图表细节,但能防止最明显的回归:iframe 没加载、高度明显不对、页面滚动体验异常。

采用建议:把它当成集成体验升级,而不是单纯版本号升级

ThingsPanel v1.2.4 的关键词是稳定、自适应、细节和兼容。对物联网平台来说,这些词不花哨,但非常接近真实交付现场。

建议采用时关注三件事:

  • 已经在业务系统中嵌入看板的团队,优先验证高度、滚动和图表完整性。
  • 准备做客户门户或运维大屏的团队,可以把 v1.2.4 作为嵌入体验的基线版本评估。
  • 对跨域、单点登录、iframe 安全头有严格要求的环境,升级前要把代理配置和浏览器策略一起检查。

看板不是孤立页面。它进入业务系统之后,才真正变成运维人员每天使用的工具。v1.2.4 的价值,也正在于把这段嵌入后的使用链路补得更稳。


相关推荐