\chapter{预警可视化大屏系统} 本章介绍基于Flask后端和ECharts前端的Web可视化大屏系统的架构设计、核心API实现和前端面板设计。 \section{系统需求分析} \subsection{功能需求} 系统面向三类用户(政府管理者、社区工作人员、公众),核心功能包括: \begin{enumerate} \item \textbf{实时气象与风险展示}:以折线图展示近期温度变化趋势和未来多时间尺度的风险等级预测 \item \textbf{多时间尺度覆盖}:同时呈现3天(操作决策)、7天(资源调配)和30天(季节性规划)三级预测 \item \textbf{人口脆弱性可视化}:饼图展示老年人口比例,暴露-反应曲线展示温度-健康风险定量关系 \item \textbf{历史数据回溯}:支持查看近90天历史温度和风险等级的时间序列 \item \textbf{年度统计摘要}:各年份高温天数、平均温度汇总 \item \textbf{自动刷新}:每30分钟自动更新数据,支持长时间无人值守运行 \end{enumerate} \subsection{非功能需求} \begin{itemize} \item 深色科技蓝视觉风格,适配LED大屏和普通显示器 \item 首次加载<3秒(含所有6图表渲染) \item 支持1920×1080至4K分辨率 \item 模型不可用时降级运行(fallback模式) \item 响应式布局,单文件部署(无外部构建工具依赖) \end{itemize} \section{系统架构} 系统采用经典B/S三层架构: \begin{itemize} \item \textbf{表示层(Browser)}:单页HTML(index.html),使用CSS Grid布局,ECharts 5.5进行图表渲染,fetch API异步通信 \item \textbf{业务逻辑层(Flask Server)}:Python Flask框架,4个RESTful API端点,延迟模型加载(lazy loading),JSON序列化 \item \textbf{数据层(File System)}:NPZ格式序列数据、PT格式模型checkpoint文件、CSV特征文件,基于文件系统的轻量级数据访问 \end{itemize} \subsection{数据流设计} 前端通过fetch API定时请求后端API → Flask路由匹配URL → 控制器函数加载数据/调用模型推理 → 数据封装为JSON → 返回前端 → ECharts根据option配置渲染图表。数据流完全异步,页面加载不阻塞。 \section{后端API实现} Flask应用包含4个端点,代码文件约110行(app.py): \subsection{GET /api/predict —— 风险预测} 核心业务端点,返回格式示例: \begin{verbatim} { "city": "焦作", "date": "2026-05-28", "predictions": { "short": { "level": 1, "label": "中风险", "color": "#ffeb3b", "confidence": 0.50, "probabilities": [0.1, 0.5, 0.3, 0.1], "suggestions": [ "注意防暑降温", "保持室内通风", "老年人减少午后外出" ] }, ... }, "risk_population": 454000 } \end{verbatim} 模型加载采用懒加载模式——Flask应用启动时仅初始化框架,首次\texttt{/api/predict}请求时才加载模型文件(耗时<2秒),降低启动延迟和空闲内存占用。 \subsection{GET /api/history —— 历史数据} 返回最近90天的JSON数组,每元素包含: \begin{itemize} \item \texttt{dates}:日期字符串,格式YYYY-MM-DD \item \texttt{temp\_mean}:日均气温(°C) \item \texttt{heat\_index}:体感温度(°C) \item \texttt{risk\_label}:风险等级(0-3) \item \texttt{heatwave}:热浪标识(0/1) \end{itemize} \subsection{GET /api/stats —— 统计摘要} 返回年度汇总数据,包括: \begin{itemize} \item \texttt{annual}:按年份组织的平均温度、热浪天数、最高温度数组 \item \texttt{aging\_rate}:两城市固定老龄化率(焦作12.8\%,郑州11.6\%) \end{itemize} \subsection{GET / —— 主页} 直接返回index.html的完整内容(单文件应用,约24KB),无需额外的静态文件服务或模板引擎。 \section{前端可视化面板} 前端为单个HTML文件,使用CDN加载ECharts 5.5主库,无其他外部依赖。CSS Grid定义6面板响应式布局。 \subsection{面板1:温度趋势图} 双Y轴折线图——日均气温(蓝色实线)和体感温度(橙色虚线)共左Y轴(°C),右Y轴为风险等级。背景标注三条水平阈值线:绿色虚线(32°C,低→中)、黄色虚线(35°C,中→高)、红色虚线(38°C,高→严重)。X轴跨90天,支持ECharts dataZoom区域缩放。 \subsection{面板2:风险预警展示} 三列卡片式布局,每卡片对应一个时间尺度。卡片内垂直排列:中文标签(最大字号)、风险颜色圆点(\texttt{border-radius: 50\%})、置信度进度条(CSS动画)、防护建议列表(\texttt{