乐于分享
好东西不私藏

实战复盘 | 基于Uni-app+FastAPI构建的智慧供热监测手机APP平台

实战复盘 | 基于Uni-app+FastAPI构建的智慧供热监测手机APP平台

实战复盘Uni-appFastAPI

在工业互联网的实际落地中,移动化管理早已不是可选项,而是直接决定工作响应速度与执行效率的关键一环。

一、 手机App在智慧供热中的必要性

在传统的供热运维中,巡检员和调度员往往受限于固定的监控机房。随着“智慧供热”的深入,手机App已从“辅助工具”转变为“核心生产力”,其必要性体现在以下几个方面:

1. 角色与作用

  • 实时监测的延伸
    将PC端的SCADA系统“装进兜里”,让运维人员在换热站现场也能随时调取历史曲线,对比运行参数。
  • 移动办公的载体
    打破空间限制,实现报警信息的秒级推送,确保重大故障在第一时间得到响应。
  • 数智化管理的闭环
    作为数据采集与反馈的终端,App连接了人与设备,让管理决策基于实时数据而非主观经验。

2. 解决的核心问题

  • 响应滞后
    通过App推送,消除人工电话通知的时延,降低爆管、停泵等事故风险。
  • 现场数据孤岛
    现场维修人员无法获取历史趋势?App通过可视化曲线,让现场人员具备“上帝视角”。
  • 巡检标准化
    解决传统纸质记录易丢失、难回溯的问题,实现巡检过程的数字化留痕。

二、 软件架构与设计流程

为了满足“多端发布(重点H5)”与“快速迭代”的需求,确定了轻量级、高效率的技术栈:

1. 技术选型

  • 前端
    Uni-app (Vue3 + TypeScript)。利用其跨平台能力,一套代码编译H5,配合 ECharts 实现复杂的工业图表。
  • 后端
    Python FastAPI。高性能的异步Web框架,非常适合处理高并发的实时数据请求。
  • 数据层
    MySQL 8.0 + SQLAlchemy。利用ORM处理复杂的关系型数据(如热力站、热源与实时数据的关联)。

2. 数据流向设计

  • 采集层
    下位机PLC采集压力、温度、流量等数据。
  • 传输层
    数据同步至中间库 (实时快照)与 station_history_cache(历史归档)。
  • 应用层
    前端轮询API,获取实时状态与24小时历史趋势。

三、 关键技术实现与结果展示

1. 核心挑战:24小时等距曲线

用户最核心的需求是:“无论后端是否有数据,X轴必须显示完整的24个整点刻度;有数据连实线,无数据连虚线。”

这听起来简单,但在实现时需要前端做大量的 数据清洗与对齐 工作:

  • Timeline生成器
    前端不依赖后端返回的时间轴,而是基于当前时间,动态生成过去24小时的标准时间序列( [’14:00′, ’15:00′, … ’13:00′] )。
  • 双层Series叠加
    为了实现“断点续连”且区分虚实线,我们采用了 双层图表策略– 底层:全量数据(空值补0),样式为虚线,作为背景参考。– 顶层:仅包含真实数据,样式为实线,覆盖在虚线之上。

2. 视觉优化:空心圆点与交互

为了达到工业级的清晰度,我们定制了ECharts的 symbol 样式:

  • 强制显示24个数据点( showSymbol: true )。
  • 自定义空心圆:背景透明,边框颜色跟随曲线颜色,大小适中。
  • Tooltip增强
    悬停时显示完整的 YYYY-MM-DD HH:MM 时间格式,防止跨天数据产生歧义。

3. 结果展示

经过优化,最终呈现出如下效果:

  • 实时性
    数据秒级刷新,状态一目了然。
  • 完整性
    即使后端仅返回8小时数据,前端也能完美铺满24小时坐标轴,缺失部分自动以虚线归零处理,不再出现图形挤压。

四、 避坑指南(血泪经验)

在开发过程中,遇到了几个典型的“深坑”,在此分享解决方案:

🛑 坑点一:ECharts初始化变成“一条垂直线”

现象:在切换Tab标签或页面刚加载时,图表挤成一条垂直细线,无法横向展开。

原因:ECharts初始化时,父容器(DOM)尚未完成渲染,导致获取到的 width 为0。

解决

  1. 强制宽度计算
    在 init 前显式计算容器宽度,若获取失败,则回退到 document.body.clientWidth。
  2. 延时重绘
    使用 setTimeout 延时100ms调用 chart.resize(),确保渲染帧结束。
  3. 监听Tab切换
    在Vue中 watch Tab的变化,一旦可见立即触发重绘。

🛑 坑点二:后端数据“断片”导致的连线混乱

现象:数据库中某些时段(如夜间)由于采集设备掉线导致数据缺失,直接渲染会导致曲线直接跨越10个小时连接,误导用户。

解决:前端引入 “模糊匹配算法”。不直接使用后端返回的时间,而是拿标准时间轴去匹配后端数据:

// 伪代码逻辑standardTimeline.map(timePoint => {    // 忽略分钟差异,只匹配小时    const match = backendData.find(d => d.time.hour === timePoint.hour);    return match ? match.value : null; // 没匹配到填null,不断连})

🛑 坑点三:H5路由栈的混乱

现象:在Uni-app H5模式下,频繁使用 uni.navigateTo 导致页面栈溢出,返回按钮失效。

解决:针对Web端特性,放弃原生路由栈,在关键页面跳转(如详情页返回列表页)时,直接使用 window.location.href 配合哈希路由,确保导航的绝对可靠。

五、 开发心得与总结

  • 数据可视化的本质是“翻译”
    后端给的是 数据(Data),前端要给的是 信息(Information)。当后端数据不完美(如缺数、断档)时,前端不能“甩锅”,而应通过合理的UI逻辑(如虚线、占位符)如实且优雅地反馈给用户。
  • 细节决定体验
    本次项目中,用户反复强调的“空心圆点颜色”、“Tooltip日期格式”、“刻度线对齐”,看似是UI小细节,实则是工业场景下快速读数的刚需。开发者不能只满足于“功能实现”,更要追求“好用”。
  • 全栈思维解Bug
    在排查“热源死机”问题时,我们编写了Python脚本直接探测数据库底层。如果不具备全栈排查能力,很容易在“是前端没调对”还是“后端没给对”之间推诿扯皮。

结语:

智慧供热系统的开发,既需要对工业协议的理解,也需要现代Web技术的加持。希望本文的复盘,能给正在从事工业App开发的同行们一些参考。

本文基于真实项目开发过程撰写,技术栈:Vue3, TypeScript, Python, MySQL.

我是专注供热数智AI与运维实战的技术分享者,每天分享关于智慧供热,数据中心,数智案例和AI技巧,随想随记随心更,喜欢可以点赞+关注!

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 实战复盘 | 基于Uni-app+FastAPI构建的智慧供热监测手机APP平台

评论 抢沙发

4 + 5 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮