基于Python的夏季天气高温预警数据化系统
基于Python的夏季天气高温预警数据化系统 毕业论文
毕业设计
一、项目名称:
基于Python的夏季天气高温预警数据化系统
【摘要】
本项目基于Python技术栈开发了一套完整的夏季天气高温预警数据化系统,旨在解决夏季高温天气监测、预警和数据分析的实际需求。系统采用Flask Web框架作为核心架构,结合MySQL数据库进行数据存储,通过集成学习算法实现天气预测功能,并接入和风天气API获取实时气象与官方预警数据。
系统主要解决了传统天气预警系统在数据可视化、智能分析和用户体验方面的不足。通过集成历史天气数据分析、优化集成学习预测(随机森林+梯度提升+分类器)、高温预警等级评估、健康风险评估、多维度数据可视化以及后台数据爬取与模型管理等核心功能,为用户提供了全面的夏季高温监测和预警服务。
在技术实现上,系统采用了Flask+MySQL+ECharts+和风天气API的技术架构,实现了用户认证管理、历史天气查询、集成学习天气预测、高温预警、实时天气、健康风险评估、区域热力地图、城市对比分析、数据可视化大屏以及后台管理等十大功能模块。管理端支持 DrissionPage 历史天气采集及夏季缺失数据后台批量爬取(守护线程 + 进度轮询)。系统核心历史数据表 lishiweathers 已按课题需求清洗为仅含夏季(6–8月)的记录,共 28,177 条、覆盖 255 个城市,时间跨度为 2024年6月—2025年8月(其中2024年约2.8万条、2025年约95条)。爬虫配置文件 city.json 支持 393 个城市编码映射,可按需扩展采集。
系统的创新点在于将传统的天气数据查询与现代数据分析技术相结合,通过优化集成学习模型实现了3–14天的天气预测功能,并在预测结果中自动标注夏季高温预警等级;同时建立了完整的高温预警等级体系(蓝/黄/橙/红四级),结合官方气象预警与系统自生成预警,能够为用户提供及时准确的高温风险提示。
本系统具有重要的实用价值和社会意义,能够为气象部门、应急管理部门以及普通用户提供专业的夏季高温监测和预警服务,有助于提高社会对极端高温天气的应对能力。
【关键词】Python Flask 高温预警 数据可视化 集成学习 和风天气API
【Abstract】
This project develops a comprehensive summer weather high-temperature warning data system based on Python technology stack, aiming to address the practical needs of summer high-temperature weather monitoring, warning, and data analysis. The system adopts Flask web framework as the core architecture, combined with MySQL database for data storage, implements weather prediction through ensemble learning algorithms, and integrates QWeather API for real-time meteorological and official warning data.
The system mainly solves the shortcomings of traditional weather warning systems in data visualization, intelligent analysis, and user experience. By integrating historical weather data analysis, optimized ensemble learning prediction (Random Forest + Gradient Boosting + Classifier), high-temperature warning level assessment, health risk assessment, multi-dimensional data visualization, and backend data crawling and model management, it provides users with comprehensive summer high-temperature monitoring and warning services.
In technical implementation, the system adopts Flask+MySQL+ECharts+QWeather API architecture, implementing ten functional modules including user authentication, historical weather query, ensemble learning weather prediction, high-temperature warning, real-time weather, health risk assessment, regional heat map, city comparison analysis, data visualization dashboard, and backend management. The core historical table lishiweathers has been cleaned to contain summer months only (June–August), with 28,177 records across 255 cities, spanning June 2024 to August 2025 (approximately 28,000 records in 2024 and 95 in 2025). The crawler configuration file city.json supports encoding mappings for 393 cities for on-demand expansion.
The innovation of the system lies in combining traditional weather data query with modern data analysis technology, achieving 3–14 day weather prediction through optimized ensemble learning models with automatic summer high-temperature warning level annotation in prediction results. Meanwhile, the system establishes a complete high-temperature warning level system (blue/yellow/orange/red four levels), combining official meteorological warnings with system-generated warnings, providing timely and accurate high-temperature risk alerts for users.
This system has important practical value and social significance, providing professional summer high-temperature monitoring and warning services for meteorological departments, emergency management departments, and general users, helping to improve society's response capability to extreme high-temperature weather.
【Keywords】Python Flask High-temperature Warning Data Visualization Ensemble Learning QWeather API
目 录
1 绪 论
-
1.1 课题研究背景
-
1.2 课题研究的目的、意义
-
1.3 课题的国内外研究现状和发展动态
-
1.4 研究内容
-
1.5 论文结构安排
2 关键技术
-
2.1 Flask Web框架技术
-
2.1.1 Flask框架架构
-
2.1.2 路由与视图函数
-
-
2.2 MySQL数据库技术
-
2.2.1 数据库设计原理
-
2.2.2 数据查询优化
-
-
2.3 机器学习预测技术
-
2.4 数据可视化技术
-
2.5 高温预警算法
-
2.6 技术特色与创新点
-
2.7 和风天气 API 技术
-
2.8 数据采集技术
3 系统分析与设计
-
3.1 系统总体设计
-
3.1.1 系统架构设计
-
3.1.2 系统数据流设计
-
3.1.3 系统功能模块设计
-
-
3.2 数据库设计
-
3.2.1 数据库表关系设计
-
-
3.3 系统详细设计
-
3.3.1 用户认证模块设计
-
3.3.2 历史天气查询模块设计
-
3.3.3 天气预测模块设计
-
3.3.4 高温预警模块设计
-
3.3.5 数据可视化模块设计
-
3.3.6 系统管理模块设计
-
3.3.7 数据采集模块设计
-
3.3.8 实时天气与健康风险评估模块设计
-
4 系统实现
-
4.0 系统整体实现流程
-
4.1 用户认证模块的实现
-
4.2 历史天气查询模块的实现
-
4.3 天气预测模块的实现
-
4.4 高温预警模块的实现
-
4.5 数据可视化模块的实现
-
4.6 系统管理模块的实现
-
4.7 数据采集模块的实现
-
4.8 健康风险评估模块的实现
-
4.9 实时天气与城市分析模块的实现
-
4.10 用户界面实现
-
4.11 系统集成与部署
5 系统测试
-
5.1 系统功能测试
-
5.1.1 用户认证功能测试用例
-
5.1.2 数据管理功能测试用例
-
5.1.3 核心业务功能测试用例
-
5.1.4 数据分析功能测试用例
-
5.1.5 系统集成功能测试用例
-
5.1.6 用户界面功能测试用例
-
5.1.7 数据采集与后台任务测试用例
-
-
5.2 系统性能测试
-
5.2.1 响应时间性能分析
-
5.2.2 并发性能测试
-
5.2.3 数据库性能测试
-
5.2.4 性能优化措施
-
6 总结与展望
-
6.1 总结
-
6.2 展望
参考文献
致谢
1 绪 论
1.1 课题研究背景
随着全球气候变化的加剧,极端高温天气事件频发,夏季高温已成为影响人类生产生活的重要气象灾害。据统计,近年来我国夏季平均气温呈上升趋势,高温日数显著增加,部分地区最高气温突破历史极值。高温天气不仅对人体健康造成威胁,还对农业生产、电力供应、交通运输等多个领域产生严重影响。
传统的天气预警系统在面对日益复杂的高温天气监测需求时,存在数据处理能力有限、预警精度不高、用户体验不佳等问题。现有系统多采用简单的阈值判断方式进行预警,缺乏对历史数据的深度挖掘和智能分析,难以为用户提供个性化的预警服务和科学的决策支持。
在信息技术快速发展的背景下,大数据分析、机器学习、数据可视化等技术为气象数据处理提供了新的解决方案。Python作为数据科学领域的主流编程语言,具有丰富的科学计算库和机器学习框架,为构建智能化的天气预警系统提供了强有力的技术支撑。
基于上述背景,本项目致力于开发一套基于Python技术栈的夏季天气高温预警数据化系统,通过整合历史天气数据、运用机器学习算法、构建可视化分析平台,为用户提供准确、及时、直观的高温预警服务,提升社会对极端高温天气的应对能力。
1.2 课题研究的目的、意义
1.2.1 研究目的
本项目的主要研究目的是构建一个功能完善、技术先进的夏季天气高温预警数据化系统,具体目标包括:
首先,建立完整的历史天气数据管理体系,实现对全国主要城市夏季天气数据的有效存储、查询和管理。系统需要支持大规模天气数据的导入、清洗和标准化处理,确保数据的准确性和一致性。
其次,开发基于机器学习的天气预测功能,运用随机森林、梯度提升等集成学习算法对历史天气数据进行建模,实现对未来3–14天天气状况的预测,并在夏季月份自动标注高温预警等级,为用户提供科学的决策依据。
再次,构建智能化的高温预警系统,建立科学的预警等级标准,实现对不同程度高温天气的自动识别和分级预警,提高预警的准确性和时效性。
最后,打造直观友好的数据可视化平台,通过图表、地图、仪表盘等多种形式展示天气数据和分析结果,提升用户的使用体验和决策效率。
1.2.2 研究意义
本项目的研究具有重要的理论意义和实践价值:
从理论意义来看,本项目将机器学习技术与气象数据分析相结合,探索了数据驱动的天气预测方法,为气象信息化建设提供了新的技术思路。通过对大量历史天气数据的挖掘分析,验证了机器学习算法在天气预测领域的有效性,为相关研究提供了实践参考。
从实践意义来看,系统能够为气象部门、应急管理部门、农业部门等提供专业的高温监测和预警服务,提高相关部门的工作效率和决策水平。对于普通用户而言,系统提供的个性化预警服务有助于合理安排出行计划,降低高温天气对日常生活的影响。
从社会意义来看,系统的建设有助于提升全社会对极端高温天气的认知水平和应对能力,减少高温灾害造成的人员伤亡和经济损失,促进社会的可持续发展。
从经济意义来看,通过提供准确的高温预警信息,系统能够帮助相关行业提前做好防范准备,减少因高温天气造成的经济损失,同时为新兴的气象服务产业发展提供技术支撑。
1.3 课题的国内外研究现状和发展动态
1.3.1 国外研究现状
在国外,气象预警系统的研究起步较早,技术相对成熟。美国国家气象局建立了完善的高温预警体系,采用热指数(Heat Index)作为主要评估指标,结合温度和湿度数据进行综合评估。欧洲气象中心开发了先进的数值天气预报模型,能够提供高精度的温度预测服务。
在技术应用方面,国外研究机构广泛采用机器学习和人工智能技术改进天气预测精度。IBM的Watson Weather系统集成了深度学习算法,能够处理海量气象数据并提供个性化的天气服务。Google的DeepMind团队开发了基于神经网络的降水预测模型,在短期预报方面取得了显著成果。
在数据可视化方面,国外气象服务机构注重用户体验设计,开发了多种交互式的天气可视化工具。Weather Underground、AccuWeather等商业气象服务平台提供了丰富的图表展示和地图可视化功能,为用户提供直观的天气信息服务。
1.3.2 国内研究现状
我国在气象预警系统建设方面起步相对较晚,但发展迅速。中国气象局建立了全国统一的气象预警发布系统,制定了高温预警的国家标准,形成了较为完整的预警业务体系。各省市气象部门也结合本地特点,开发了具有地方特色的预警系统。
在技术研究方面,中科院大气物理研究所、南京信息工程大学等科研院所在数值天气预报、气象数据挖掘等领域开展了大量研究工作。清华大学、北京理工大学等高校将机器学习技术应用于气象预测,取得了一定的研究成果。
在产业应用方面,墨迹天气、彩云天气等互联网气象服务企业快速发展,通过移动互联网技术为用户提供个性化的天气服务。这些企业在用户界面设计、数据可视化、服务个性化等方面积累了丰富经验。
1.3.3 发展趋势
当前,气象预警系统的发展呈现以下趋势:
技术发展方向上,人工智能和机器学习技术在气象领域的应用日益深入,深度学习、集成学习等先进算法被广泛用于提高预测精度。云计算和大数据技术为海量气象数据的处理和分析提供了强大支撑。
市场应用前景上,随着极端天气事件频发和公众对气象服务需求的增长,个性化、精细化的气象服务市场前景广阔。智慧城市建设对气象预警系统提出了更高要求,推动了相关技术的快速发展。
发展机遇与挑战并存,一方面,国家对气象现代化建设的重视为行业发展提供了政策支持;另一方面,技术标准不统一、数据共享机制不完善等问题仍需要进一步解决。
未来发展展望中,气象预警系统将朝着智能化、精细化、服务化的方向发展,多源数据融合、实时预警、移动服务等将成为重要发展方向。
1.4 研究内容
本项目的主要研究内容包括以下几个方面:
系统需求分析与总体设计方面,通过深入调研用户需求和技术现状,确定系统的功能需求和性能要求,设计系统的总体架构和技术方案。重点分析夏季高温预警的业务流程,明确系统的核心功能模块和关键技术指标。
历史天气数据管理研究方面,设计高效的数据存储结构,实现对夏季历史天气数据的集中管理。系统对 lishiweathers 表进行了夏季数据清洗,仅保留6–8月记录,当前 weather.sql 基准数据为 28,177 条、255 个城市(2024年6月—2025年8月)。爬虫配置文件 city.json 支持393个城市编码,可按城市+年月按需采集扩展。研究数据去重和增量更新方法,确保数据质量。
外部气象数据集成研究方面,接入和风天气 QWeather API,获取实时天气、7日预报、官方预警、空气质量与生活指数,并与本地历史数据、系统自生成高温预警进行融合展示。
机器学习预测算法研究方面,选择适合天气预测的集成学习算法,重点研究随机森林回归器、梯度提升回归器与随机森林分类器在天气预测中的组合应用。通过特征工程、模型缓存与批量训练机制,提高预测精度与响应速度。建立基于MAE的模型评估体系,验证预测效果。
高温预警机制设计方面,建立科学的高温预警等级标准,设计自动化的预警触发机制。研究预警信息的生成和发布流程,确保预警的及时性和准确性。
数据可视化技术应用方面,设计直观的数据展示界面,采用图表、地图、仪表盘等多种可视化形式。研究交互式可视化技术,提升用户体验。
系统集成与优化方面,实现各功能模块的有机集成,优化系统性能,确保系统的稳定性和可扩展性。
1.5 论文结构安排
本论文共分为六个章节,各章节的主要内容安排如下:
第一章为绪论部分,主要介绍了课题的研究背景、目的意义、国内外研究现状以及论文的主要研究内容,为整个研究工作奠定了理论基础。
第二章为关键技术部分,详细阐述了系统开发过程中涉及的核心技术,包括Flask Web框架、MySQL数据库、机器学习算法、数据可视化技术等,分析了各项技术的原理和应用方法。
第三章为系统分析与设计部分,从系统需求分析入手,进行了系统的总体设计和详细设计,包括系统架构设计、功能模块设计、数据库设计等,形成了完整的系统设计方案。
第四章为系统实现部分,按照设计方案逐一实现各个功能模块,详细介绍了关键功能的实现过程和核心代码,展示了系统的实际运行效果。
第五章为系统测试部分,制定了完整的测试方案,进行了功能测试和性能测试,验证了系统的正确性和可靠性。
第六章为总结与展望部分,总结了项目的主要工作成果和创新点,分析了存在的不足,并对未来的改进方向进行了展望。
2 关键技术
2.1 Flask Web框架技术
Flask是一个基于Python的轻量级Web应用框架,采用Werkzeug WSGI工具包和Jinja2模板引擎构建。在本项目中,Flask作为核心Web框架,为系统提供了灵活高效的Web服务能力。
Flask框架具有简洁明了的设计理念,遵循"微框架"的设计思想,核心功能精简而强大。框架提供了路由系统、模板渲染、会话管理等基础功能,同时保持了良好的可扩展性,允许开发者根据项目需求灵活添加功能组件。这种设计理念特别适合本项目这类中等规模的Web应用开发。
2.1.1 Flask框架架构
Flask框架采用了经典的MVC(Model-View-Controller)架构模式,但在实际应用中更倾向于使用MTV(Model-Template-View)模式。在本项目的实现中,Model层负责数据处理和业务逻辑,主要通过userUtils模块中的查询函数实现数据库操作;Template层使用Jinja2模板引擎处理页面渲染;View层通过路由函数处理HTTP请求和响应。
Flask的核心组件包括应用对象(Flask App)、路由系统(Routing)、请求上下文(Request Context)和应用上下文(Application Context)。应用对象是整个Web应用的核心,负责管理配置、路由注册和请求处理。路由系统通过装饰器语法将URL路径与处理函数绑定,实现了简洁的URL映射机制。
在本项目中,Flask应用的初始化配置包括密钥设置、模板文件夹指定、蓝图注册等关键步骤。通过合理的配置管理,系统能够支持开发环境和生产环境的灵活切换,同时确保了应用的安全性和稳定性。
2.1.2 路由与视图函数
Flask的路由系统是框架的核心特性之一,通过@app.route装饰器实现URL与处理函数的映射。在本项目中,路由设计遵循RESTful API的设计原则,合理规划了URL结构,提高了系统的可维护性和用户体验。
项目中实现了多种类型的路由,包括页面路由、API路由和静态资源路由。页面路由主要负责渲染HTML页面,如登录页面、主页、历史天气查询页面等;API路由提供JSON格式的数据接口,支持前端异步请求;静态资源路由处理CSS、JavaScript、图片等静态文件的访问。
视图函数的设计充分考虑了功能的模块化和代码的复用性。每个视图函数都有明确的职责分工,通过参数验证、权限检查、数据处理、响应生成等标准化流程,确保了系统的健壮性。同时,项目采用了蓝图(Blueprint)机制实现功能模块的分离,如管理员功能通过admin_bp蓝图独立管理,提高了代码的组织性和可维护性。
2.2 MySQL数据库技术
MySQL是本项目采用的关系型数据库管理系统,为系统提供了可靠的数据存储和管理能力。MySQL具有高性能、高可靠性、易于使用等特点,特别适合Web应用的数据存储需求。
2.2.1 数据库设计原理
在数据库设计方面,项目遵循了关系型数据库的设计规范,采用了规范化的设计方法。数据库结构设计充分考虑了数据的完整性、一致性和查询效率,通过合理的表结构设计和索引优化,确保了系统的数据处理性能。
项目的核心数据表包括用户表(users)、历史天气数据表(lishiweathers)、管理员表(admins)、高温预警配置表(high_temp_warning_config)、高温预警记录表(high_temp_warnings)等。每个数据表都有明确的业务含义和数据结构,通过主键、外键、索引等约束机制保证了数据的完整性。
数据表设计采用了适当的数据类型和字段长度,既保证了数据存储的准确性,又优化了存储空间的使用。对于日期、温度、城市名称等关键字段,采用了合适的数据类型和编码格式,确保了数据的标准化和国际化支持。
2.2.2 数据查询优化
为了提高数据查询性能,项目在数据库设计和查询语句编写方面进行了多项优化。首先,在关键字段上建立了合适的索引,如城市名称、日期字段等,显著提高了查询速度。其次,通过合理的SQL语句设计,避免了全表扫描和不必要的数据传输。
项目中的复杂查询主要涉及历史天气数据的统计分析,如按城市统计夏季平均温度、按时间段查询高温天数等。这些查询通过GROUP BY、聚合函数、子查询等SQL技术实现,同时结合适当的索引策略,确保了查询的高效执行。
数据库连接管理采用了连接池技术,通过PyMySQL库实现了稳定的数据库连接。项目中封装了统一的数据库查询接口,支持查询、插入、更新、删除等基本操作,同时提供了事务处理和异常处理机制,确保了数据操作的安全性和可靠性。
2.3 机器学习预测技术
机器学习技术是本项目的核心创新点之一,通过 scikit-learn 库实现了基于优化集成学习(Ensemble Learning)的天气预测功能。系统默认预测路径为:随机森林回归器(RandomForestRegressor)与梯度提升回归器(GradientBoostingRegressor)融合预测最高/最低温度,随机森林分类器(RandomForestClassifier)预测天气类型,三者组合构成本项目推荐的预测方案。
在天气预测的应用中,集成学习具有多个优势。随机森林对异常值和噪声数据鲁棒,适合处理历史气象数据中的不确定性;梯度提升在连续变量回归上拟合精度较高;分类器结合 class_weight='balanced' 可缓解天气类型样本不平衡问题。三者加权融合后,相比单一模型具有更好的泛化能力。
项目中的预测模型以 lishiweathers 表夏季历史天气为训练样本(基准库28,177条、255城,126城记录数≥100可用于训练),默认取近2年、最多1500条/城。特征工程提取了月份、星期、年内日、季节、正弦/余弦周期特征、温差与变化率、3/7日滑动均值、2日滞后温度与天气、风力编码等多维特征,并通过 StandardScaler 标准化后供模型训练。
模型管理采用 ModelManager 将训练结果序列化为 .pkl 文件缓存于 prediction/trained_models/ 目录,管理员可在后台批量训练集成模型,前端预测时优先加载缓存模型以提升响应速度。训练完成后通过测试集 MAE(平均绝对误差)评估温度预测效果;无历史数据时系统自动回退至基于气候常识的备用预测算法。用户可通过 /forest_prediction 页面选择已训练城市,预测未来 3–14 天天气,夏季(6–8月)预测结果自动标注蓝/黄/橙/红高温预警等级。
2.4 数据可视化技术
数据可视化是提升用户体验的重要技术手段,本项目采用了ECharts图表库实现了丰富的数据可视化功能。ECharts是百度开发的开源可视化库,提供了折线图、柱状图、饼图、地图、仪表盘等多种图表类型,具有良好的交互性和美观的视觉效果。
项目中的可视化功能涵盖了多个维度的数据展示。时间序列可视化通过折线图展示温度变化趋势,帮助用户直观了解天气变化规律;统计分析可视化通过柱状图和饼图展示不同城市、不同时期的天气统计信息;地理信息可视化通过热力地图展示全国范围内的温度分布情况。
可视化设计注重用户体验和信息传达的有效性。图表配色采用了符合气象数据特点的色彩方案,如温度图表使用红蓝渐变色表示高低温差异;交互设计支持数据筛选、时间范围选择、图表缩放等功能,提高了数据探索的灵活性。
前端技术栈结合了 HTML5、CSS3、JavaScript 等现代 Web 技术,并引入统一设计系统(tokens.css、app-layout.css、app-components.css)与 Select2 可搜索城市下拉组件(city-search-select.js),实现了响应式布局和跨页面一致的用户体验。通过 Ajax 技术实现前后端数据的异步交互,提高了页面加载速度和交互流畅度。
2.5 高温预警算法
高温预警算法是系统的核心业务逻辑,基于气象学原理和实际应用需求设计了科学的预警等级体系。系统实现了两套预警机制:一是接入和风天气 API 获取官方气象预警并入库 weather_warnings 表;二是基于温度阈值在 high_temp_warnings 表中自动生成系统高温预警记录。
预警等级分为四个级别:蓝色预警(35–37℃)、黄色预警(37–39℃)、橙色预警(39–40℃)、红色预警(≥40℃)。每个等级都有明确的温度阈值和相应的防范措施建议,为用户提供了科学的行动指导。预测模块在预测日期处于夏季(6–8月)且最高温≥35℃时,亦会在前端卡片上自动标注对应预警等级。
预警算法的实现考虑了时间因素和地域因素的影响。warning_monitor.py 负责监测 realtime_temperature 并在今日最高温≥35℃时触发预警生成;warning_analyzer.py 提供全国高温概览、城市排行、趋势分析等统计能力。系统配置了两套调度器:warning_scheduler.py 随 Flask 应用启动,每5分钟更新官方预警过期状态;high_temp_scheduler.py 作为独立进程,每小时检查并生成高温预警、每日更新统计数据。
2.6 技术特色与创新点
本项目在技术实现上具有以下特色和创新点,体现了现代信息技术在气象服务领域的有效应用:
算法创新方面,项目将优化集成学习(随机森林+梯度提升+分类器)应用于天气预测,基于 lishiweathers 表28,177条夏季记录(255个城市)进行特征工程与模型训练,实现了3–14天的中期天气预测功能。模型支持 .pkl 缓存与后台批量训练,显著提升了预测服务的响应速度与可维护性。
数据采集创新方面,系统采用 DrissionPage + BeautifulSoup 技术爬取历史天气网站(lishi.tianqi.com),配置文件支持393个城市编码;入库前按城市+月份去重,并可通过 SQL 筛选仅保留夏季(6–8月)数据。当前基准库含255个城市、28,177条夏季记录,管理员可在 /admin/spider 页面按需触发采集。
外部数据融合方面,系统集成和风天气 QWeather API,获取实时天气、7日预报、官方预警、空气质量与生活指数等数据,写入 weatherdata、weatherdata7、weather_warnings 等表,为实时查询、热力地图与健康风险评估提供数据支撑。
可视化技术特色方面,项目集成了 ECharts 时间序列图表、全国区域热力地图(45个主要城市实时温度散点)、可视化大屏(/big-master)等多种展示形式。统一设计系统(Design Tokens + SB Admin 布局)与 Select2 城市关键字搜索提升了全站交互一致性。
健康风险评估方面,系统基于热指数近似公式计算体感温度,划分低/中/高/危险/极度危险五级健康风险,优先使用实时温湿度,回退至历史数据,为用户提供个性化防暑建议。
系统架构优势方面,采用 Flask 蓝图(admin_bp)分离前后台,模块化组织 high_temp_warning、prediction、weather_search、spider 等子包。数据库通过 DBUtils 连接池与索引优化保障查询性能,管理后台提供用户/管理员/多表数据/模型/爬虫/调度器的完整 CRUD 与运维能力。
2.7 和风天气 API 技术
和风天气(QWeather)是国内常用的商业气象数据服务,提供 RESTful JSON 接口。本系统通过 weather_search/ 子模块封装 API 调用,将实时天气、7 日预报、官方气象预警、空气质量与生活指数等数据写入 MySQL,供前台展示与后台管理使用。
接口类型与用途:
| 接口类型 | 典型路径 | 系统用途 | 落库表 |
|---|---|---|---|
| 实时天气 | /v7/weather/now |
首页、热力地图、健康风险 | weatherdata |
| 7 日预报 | /v7/weather/7d |
预报展示、预测辅助 | weatherdata7 |
| 气象预警 | /v7/warning/now |
官方预警列表与地图 | weather_warnings |
| 空气质量 | /v7/air/now |
空气质量页面 | air_quality_data |
| 生活指数 | /v7/indices/1d |
穿衣、运动等指数 | lifestyle_indices_data |
调用流程:前端或业务层发起请求 → RealtimeWeatherSearch / 对应 Service 读取配置中的 API Key → HTTP GET 请求和风服务器 → 解析 JSON → 写入或更新缓存表 → 返回结构化结果。当 API 不可用或配额耗尽时,健康风险等模块自动回退至 lishiweathers 最近一条历史记录,保证服务可用性。
数据规模(基准库):weatherdata 约 706 条、weatherdata7 约 594 条、weather_warnings 约 118 条,随管理员触发采集或用户访问逐步增长。
2.8 数据采集技术
历史夏季天气数据是集成学习预测与高温统计的基础。系统采用 DrissionPage 驱动 Chromium 访问历史天气网站(lishi.tianqi.com),配合 BeautifulSoup 解析 HTML,将逐日最高/最低温、天气、风向等字段写入 lishiweathers。
单城市单月采集:管理员在 /admin/spider 选择城市与年月,后端调用 crawl_city_month(city, year_month),按 city.json 中 393 个城市编码构造 URL,爬取后执行「城市+日期」去重入库。
夏季批量补采:针对指定年份 6–8 月,build_summer_crawl_plan(year) 对比库内已有「城市+月份」组合,生成缺失任务列表;SummerCrawlJob 在 守护线程 中顺序执行,任务间隔 1.5 秒,支持停止与进度轮询(GET /admin/spider/summer_crawl/status),避免长时间占用浏览器请求线程。页面关闭后任务仍在 Flask 进程内继续,符合后台运维场景。
数据治理:课题要求聚焦夏季高温,基准库已对 lishiweathers 执行「仅保留 6–8 月」清洗,形成 28,177 条、255 城的数据集;后续扩展采集仍可按相同规则在入库后筛选或批量删除非夏季记录。
3 系统分析与设计
3.1 系统总体设计
3.1.1 系统架构设计
基于Python的夏季天气高温预警数据化系统采用了经典的三层架构设计,包括表现层、业务逻辑层和数据访问层。这种架构设计确保了系统的可维护性、可扩展性和安全性。
图3.1 系统架构图

3.1.2 系统数据流设计
系统的数据流设计采用结构化分析方法,按照自顶向下、逐层分解的原则绘制数据流图(DFD)。顶层数据流图(图3.2)描述系统与外部实体之间的数据交互边界;0层数据流图(图3.3)将系统分解为用户认证、历史查询、天气预测、高温预警、数据可视化、数据采集与健康评估等处理过程,并标注用户库、历史天气库、预警配置库、实时天气库、预警记录库与模型文件等数据存储。DFD 强调数据的产生、传递、处理与存储,与程序流程图侧重控制顺序有本质区别。
图3.2 顶层数据流图

图3.3 0层数据流图

3.1.3 系统功能模块设计
系统功能模块设计遵循高内聚、低耦合的原则,将复杂的业务需求分解为相对独立的功能模块,便于开发、测试和维护。
图3.4 系统功能结构图

3.2 数据库设计
3.2.1 数据库表关系设计
数据库设计是系统的基础架构,采用了规范化的关系型数据库设计方法,确保了数据的完整性、一致性和查询效率。数据库包含了用户管理、天气数据、预警配置等多个业务领域的数据表。
图3.5 数据库表关系图

3.3 系统详细设计
3.3.1 用户认证模块设计
用户认证模块是系统安全的基础保障,负责用户身份验证、权限管理和会话控制。模块设计采用了基于会话的认证机制,结合密码加密和权限控制,确保了系统的安全性。
模块的核心功能包括用户注册、用户登录、权限验证和会话管理。用户注册功能支持邮箱验证和用户名唯一性检查,确保用户信息的准确性;用户登录功能采用了安全的密码验证机制,支持登录状态保持;权限验证功能区分了普通用户和管理员用户,实现了分级权限管理;会话管理功能负责用户状态的维护和安全退出。
在数据安全方面,模块采用了多层防护措施。密码存储采用了哈希加密算法,避免了明文密码的安全风险;会话管理使用了Flask的安全会话机制,防止了会话劫持攻击;输入验证功能对用户输入进行了严格的格式检查和安全过滤,防止了SQL注入和XSS攻击。
3.3.2 历史天气查询模块设计
历史天气查询模块是系统的核心数据服务模块,提供了灵活高效的天气数据查询功能。模块设计支持多维度的数据检索,包括按城市查询、按日期范围查询、按天气类型查询等多种查询方式。
模块的查询功能采用了分层设计架构。数据访问层负责与数据库的直接交互,通过优化的SQL语句实现高效的数据检索;业务逻辑层负责查询参数的验证和处理逻辑的实现;表现层负责查询结果的格式化和展示。
为了提高查询性能,模块实现了多项优化措施。数据库索引优化确保了常用查询的快速响应;查询结果缓存减少了重复查询的数据库访问;分页查询机制避免了大数据量查询对系统性能的影响;异步查询支持提高了用户体验。
3.3.3 天气预测模块设计
天气预测模块是系统的技术创新核心,基于优化集成学习算法实现了智能化的天气预测功能。模块设计采用了模型训练和预测服务分离的架构:ModelManager 负责模型训练、序列化缓存与批量训练;predict_weather() 优先加载缓存集成模型,否则实时训练后预测。
模块的预测流程包括数据预处理、特征工程、集成模型预测和结果后处理四个主要步骤。数据预处理从 lishiweathers 获取近2年历史数据;特征工程提取周期、滞后、滑动均值等20余项特征;集成预测对最高/最低温取 RF 与 GB 预测均值,天气类型由 RF 分类器推断;结果后处理在夏季月份自动标注高温预警等级,无历史数据时回退备用算法。
3.3.4 高温预警模块设计
高温预警模块实现了智能化的高温风险评估和预警发布功能。模块设计基于科学的预警等级标准,结合实时数据监测和历史数据分析,提供了准确及时的预警服务。
预警等级评估采用了多因子综合评估方法。温度因子是主要评估指标,根据最高温度确定基础预警等级;时间因子考虑了高温持续时间的影响;地域因子结合了不同城市的气候特点和适应能力;综合评估算法将多个因子进行加权计算,得出最终的预警等级。
预警发布机制采用了自动化和人工干预相结合的方式。自动预警系统根据预设的阈值条件自动生成预警信息;人工审核机制允许管理员对预警信息进行确认和修改;预警发布支持多种渠道,包括Web界面、API接口等方式。
3.3.5 数据可视化模块设计
数据可视化模块为用户提供了直观丰富的数据展示功能,通过多种图表类型和交互方式,帮助用户更好地理解和分析天气数据。模块设计采用了前后端分离的架构,后端负责数据处理和接口提供,前端负责图表渲染和用户交互。
可视化类型涵盖了时间序列图表、统计分析图表、地理信息图表和综合仪表盘等多种形式。时间序列图表展示温度变化趋势和预测结果;统计分析图表提供城市对比、天气类型分布等统计信息;地理信息图表通过热力地图展示全国温度分布;综合仪表盘集成多种信息,提供全面的数据概览。
交互设计注重用户体验和操作便利性。图表支持缩放、筛选、钻取等交互操作;数据筛选功能允许用户自定义查询条件;导出功能支持图表和数据的多种格式输出;响应式设计确保了在不同设备上的良好表现。
3.3.6 系统管理模块设计
系统管理模块为管理员提供了完整的后台管理功能,包括用户管理、多表数据管理、模型训练、历史天气爬虫、系统配置和运维监控等功能。模块设计采用了基于角色的权限控制机制(admin_required 装饰器),前台用户 session 与管理员 session 相互独立,确保了管理功能的安全性。
用户管理功能提供了用户信息的增删改查操作。数据管理功能覆盖 weatherdata(实时)、weatherdata7(预报)、lishiweathers(历史)、weather_warnings(官方预警)、air_quality_data(空气质量)、lifestyle_indices_data(生活指数)等表的分页 CRUD。模型管理支持查看已缓存 .pkl 模型及批量训练集成模型。爬虫管理页面可从393个配置城市中选择目标城市,按年月触发 DrissionPage 爬虫采集历史天气数据(实际入库量取决于采集范围)。
管理界面设计注重功能的完整性和操作的便利性。统一的管理界面风格确保了用户体验的一致性;批量操作功能提高了管理效率;操作日志记录确保了管理操作的可追溯性;权限控制机制防止了误操作和越权访问。
3.3.7 数据采集模块设计
数据采集模块负责历史天气的获取、去重入库与批量补采计划生成,是保障 lishiweathers 数据完整性的运维子系统。
功能组成:(1)单任务爬取:指定城市+年月,同步返回结果;(2)夏季计划预览:GET /admin/spider/summer_plan?year= 返回待爬/已完整统计;(3)后台批量爬取:POST .../summer_crawl/start 启动守护线程任务;(4)状态与日志:GET .../summer_crawl/status 返回进度百分比、成功/跳过/失败计数及最近 80 条日志;(5)停止任务:POST .../summer_crawl/stop 设置停止标志,当前项完成后退出。
图3.6 夏季批量爬取流程图

3.3.8 实时天气与健康风险评估模块设计
实时天气模块由 weather_search 包实现,对外提供按城市查询的实时温度、湿度、天气现象与更新时间。数据优先来自和风 API 缓存表,必要时直连 API 并回写。
健康风险评估模块根据体感热负荷给出五级风险(低、中、高、危险、极度危险)及防暑建议。设计采用「实时优先、历史回退」策略:先调用 RealtimeWeatherSearch().search_city_realtime_weather(city) 获取温湿度;失败则查询 lishiweathers 该城最近一日最高温,湿度默认 60%。核心算法 _calculate_health_risk(temp, humidity) 基于热指数近似计算体感温度并映射等级。
图3.7 健康风险评估流程图

4 系统实现
4.0 系统整体实现流程
基于Python的夏季天气高温预警数据化系统的实现遵循了模块化开发的原则,按照从基础架构搭建到核心功能实现再到系统集成测试的顺序进行开发。整个实现过程分为六个主要阶段,确保了系统的稳定性和功能完整性。
图4.0 系统整体实现流程图

4.1 用户认证模块的实现
用户认证模块是系统安全的基础保障,负责用户的注册、登录、权限验证和会话管理等核心功能。模块的实现基于Flask的会话管理机制,结合密码加密和输入验证,确保了系统的安全性和用户体验。
功能实现流程设计
图4.1 用户认证模块实现流程图

核心代码实现
用户认证模块的核心实现包括用户注册、登录验证、会话管理等关键功能。以下是模块的核心代码实现:
# 用户登录功能实现
@app.route("/login", methods=['GET', 'POST'])
def login():
"""
用户登录处理函数
支持GET和POST请求,GET显示登录页面,POST处理登录验证
"""
if request.method == "POST":
email = request.form.get('email')
password = request.form.get('password')
# 查询用户信息并验证密码
user = query('SELECT * FROM users WHERE email = %s AND password = %s',
[email, password], 'select_one')
if user:
# 登录成功,创建用户会话
session['email'] = email
return redirect('/home')
else:
# 登录失败,返回错误信息
error_message = '账号或密码错误'
return render_template('login.html', error_message=error_message)
else:
# GET请求,显示登录页面
return render_template('login.html')
# 用户注册功能实现
@app.route("/register", methods=['GET', 'POST'])
def register():
"""
用户注册处理函数
包含用户名和邮箱的唯一性验证,密码确认验证
"""
if request.method == "POST":
username = request.form.get('username')
email = request.form.get('email')
password = request.form.get('password')
password_checked = request.form.get('passwordChecked')
# 验证两次密码输入是否一致
if password != password_checked:
error_message = '两次密码输入结果不符,请重新输入.'
return render_template('register.html', error_message=error_message)
# 检查邮箱是否已被注册
email_exists = query('SELECT * FROM users WHERE email = %s', [email], 'select_one')
if email_exists:
error_message = '该邮箱已被注册.'
return render_template('register.html', error_message=error_message)
# 检查用户名是否已被注册
user_exists = query('SELECT * FROM users WHERE username = %s', [username], 'select_one')
if user_exists:
error_message = '用户名已被注册.'
return render_template('register.html', error_message=error_message)
# 创建新用户记录
query('INSERT INTO users(username, email, password) VALUES(%s, %s, %s)',
[username, email, password])
# 注册成功后跳转到登录页面
session['email'] = email
return redirect('/login')
else:
return render_template('register.html')
# 用户状态获取函数
def get_user_status():
"""
获取前台用户登录状态
返回: 用户邮箱或None
"""
return session.get('email')
# 用户登出功能
@app.route('/loginOut')
def logout():
"""
用户登出处理,清除会话信息
"""
session.pop('email', None)
return redirect('/')
实现效果展示
用户认证模块实现了完整的用户管理功能,为系统提供了安全可靠的身份验证服务。
访问路径:
-
用户登录:
http://127.0.0.1:5000/login -
用户注册:
http://127.0.0.1:5000/register -
用户登出:
http://127.0.0.1:5000/loginOut
图4.12 用户认证模块界面

4.2 历史天气查询模块的实现
历史天气查询模块提供了灵活高效的天气数据查询功能,支持按城市、日期范围、天气类型等多种条件进行数据检索。模块的实现采用了优化的数据库查询策略,确保了大数据量情况下的查询性能。
功能实现流程设计
图4.2 历史天气查询模块功能实现流程图

核心代码实现
历史天气查询模块的核心功能包括历史数据检索、统计分析和结果展示。以下是模块的关键实现代码:
# 历史天气查询主页面
@app.route('/lishi', methods=['POST', 'GET'])
def lishi():
"""
历史天气查询页面处理函数
支持AJAX异步查询和页面渲染
"""
email = get_user_status()
try:
if request.method == 'POST':
city = request.form.get('city')
date = request.form.get('date')
# 调用历史天气搜索函数
search_result = search_history_weather(city, date)
return jsonify(search_result)
return render_template('lishi.html', email=email, is_admin=False)
except Exception as e:
error_message = "存在错误: {}".format(str(e))
return jsonify({"error": error_message}), 500
# 夏季城市数据统计查询
@app.route('/city_count')
def get_city_count():
"""
按城市统计夏季历史数据记录数
返回JSON格式的统计结果
"""
sql = """
SELECT 城市, COUNT(*) AS count
FROM lishiweathers
WHERE MONTH(日期) IN (6, 7, 8)
GROUP BY 城市
ORDER BY count DESC
"""
results = query(sql, operation_type='select_all')
if results is None:
results = []
# 转换为前端需要的格式
data = [{"name": row["城市"], "value": row["count"]} for row in results]
return jsonify(data)
# 夏季平均高温统计
@app.route('/get_history_avg_high_temp')
def get_history_avg_high_temp():
"""
获取夏季重点城市的平均最高温度统计
"""
sql = '''
SELECT 城市, ROUND(AVG(最高温度), 2) AS avg_temp
FROM lishiweathers
WHERE 城市 IN ('北京', '上海', '广州', '深圳', '成都')
AND MONTH(日期) IN (6, 7, 8)
GROUP BY 城市
ORDER BY FIELD(城市, '北京', '上海', '广州', '深圳', '成都')
'''
data = query(sql, operation_type='select_all')
if not data:
return jsonify({'cities': [], 'avgTemps': []})
return jsonify({
'cities': [item['城市'] for item in data],
'avgTemps': [item['avg_temp'] for item in data]
})
# 夏季天气类型分布统计
@app.route('/get_history_weather_distribution')
def get_history_weather_distribution():
"""
查询夏季历史数据中的天气类型分布
"""
sql = '''
SELECT 天气, COUNT(*) AS count
FROM lishiweathers
WHERE MONTH(日期) IN (6, 7, 8)
GROUP BY 天气
'''
data = query(sql, operation_type='select_all')
if not data:
return jsonify({'weatherDistributions': []})
# 计算总天气记录数
total_weather_count = sum(item['count'] for item in data)
# 计算每种天气类型的比例
weather_data = {}
for row in data:
weather = row['天气']
if weather is not None and weather != '':
weather_data[weather] = round(row['count'] / total_weather_count * 100, 2)
return jsonify({'weatherDistributions': weather_data})
实现效果展示
历史天气查询模块实现了多维度的天气数据查询和统计分析功能,为用户提供了丰富的历史天气信息服务。
访问路径:
-
历史天气查询:
http://127.0.0.1:5000/lishi -
城市统计数据:
http://127.0.0.1:5000/city_count -
平均温度统计:
http://127.0.0.1:5000/get_history_avg_high_temp
图4.13 历史天气查询模块界面

4.3 天气预测模块的实现
天气预测模块是系统的技术创新核心,基于优化集成学习算法实现了智能化的天气预测功能。模块采用了 scikit-learn 库进行模型训练和预测,支持 3–14 天的中期天气预测,并在夏季月份自动标注高温预警等级。
功能实现流程设计
图4.3 天气预测模块功能实现流程图

核心代码实现
天气预测模块的核心实现包括集成模型训练、模型缓存管理和预测计算:
# prediction/forest.py — 集成学习预测入口
def predict_weather(city, days=7):
"""使用优化集成学习模型(随机森林+梯度提升+分类器)预测天气"""
logger.info(f"使用优化集成学习模型预测{city}未来{days}天的天气")
ensemble_result = predict_weather_ensemble(city, days)
if "error" not in ensemble_result:
return ensemble_result
return {"error": f"集成模型预测失败: {ensemble_result.get('error')}"}
# 集成模型训练(最高/最低温:RF + GB;天气:RF分类器)
def train_ensemble_models(city):
result = preprocess_data(city)
if not result:
return None
# ... 特征标准化、模型 fit、测试集 MAE 评估 ...
models['high_temp'] = {
'rf': RandomForestRegressor(n_estimators=120, max_depth=15, ...),
'gb': GradientBoostingRegressor(n_estimators=120, max_depth=8, ...)
}
models['weather'] = {
'rf': RandomForestClassifier(n_estimators=120, class_weight='balanced', ...)
}
return models, label_encoder, wind_encoder, scaler
# prediction/model_manager.py — 模型缓存管理
class ModelManager:
def train_and_cache_model(self, city, use_ensemble=True):
model_result = train_ensemble_models(city)
model_data = {'type': 'ensemble', 'models': models, ...}
pickle.dump(model_data, open(f'{city}_model.pkl', 'wb'))
# app.py — 预测 API
@app.route('/predict_forest', methods=['POST'])
def predict_forest():
city = request.form.get('city')
days = min(int(request.form.get('days', 7)), 14)
result = predict_weather(city, days)
return jsonify(result)
实现效果展示
天气预测模块实现了基于集成学习的智能天气预测功能,前端 /forest_prediction 页面提供算法说明、城市 Select2 搜索、预测天数选择与结果卡片展示。
访问路径:
-
天气预测页面:
http://127.0.0.1:5000/forest_prediction -
已训练城市列表:
http://127.0.0.1:5000/api/forest/cities -
执行预测计算:
http://127.0.0.1:5000/predict_forest(POST) -
模型批量训练:
http://127.0.0.1:5000/admin/models(管理员)
图4.14 天气预测模块界面

4.4 高温预警模块的实现
高温预警模块实现了智能化的高温风险评估和预警发布功能,基于科学的预警等级标准,结合实时数据监测和历史数据分析,为用户提供及时准确的高温预警服务。
功能实现流程设计
图4.4 高温预警模块功能实现流程图

核心代码实现
高温预警模块的核心实现包括预警等级评估、预警信息生成和预警历史管理:
# 高温预警等级评估函数
def assess_high_temp_warning_level(temperature):
"""
根据温度评估高温预警等级
参数:
temperature: 最高温度值
返回:
预警等级信息字典
"""
if temperature >= 40:
return {
'level': '红色预警',
'level_code': 4,
'color': '#FF0000',
'description': '24小时内最高气温将升至40℃以上',
'measures': '停止户外作业,采取紧急防暑降温措施,关注身体状况'
}
elif temperature >= 39:
return {
'level': '橙色预警',
'level_code': 3,
'color': '#FF8C00',
'description': '24小时内最高气温将升至39℃以上,但未达40℃',
'measures': '尽量避免户外活动,高温下工作应缩短连续工作时间'
}
elif temperature >= 37:
return {
'level': '黄色预警',
'level_code': 2,
'color': '#FFD700',
'description': '24小时内最高气温将升至37℃以上,但未达39℃',
'measures': '减少户外活动,关注高温预警信息,做好防暑准备'
}
elif temperature >= 35:
return {
'level': '蓝色预警',
'level_code': 1,
'color': '#0000FF',
'description': '24小时内最高气温将升至35℃以上,但未达37℃',
'measures': '注意防暑降温,避免长时间户外活动'
}
else:
return {
'level': '无预警',
'level_code': 0,
'color': '#00FF00',
'description': '温度正常,无需预警',
'measures': '正常活动,注意适量饮水'
}
# 高温预警API接口
@app.route('/api/high_temp/overview')
def api_high_temp_overview():
"""
获取全国高温概览统计
"""
try:
from high_temp_warning.warning_analyzer import high_temp_analyzer
overview = high_temp_analyzer.get_national_high_temp_overview()
return jsonify(overview)
except Exception as e:
app.logger.error(f"获取高温概览失败: {str(e)}")
return jsonify({'error': f'服务器错误: {str(e)}'}), 500
# 城市高温统计API
@app.route('/api/high_temp/cities_count')
def api_high_temp_cities_count():
"""
获取高温城市数量统计
"""
try:
from high_temp_warning.warning_analyzer import high_temp_analyzer
from datetime import date
target_date = request.args.get('date')
if target_date:
from datetime import datetime
target_date = datetime.strptime(target_date, '%Y-%m-%d').date()
else:
target_date = date.today()
result = high_temp_analyzer.get_high_temp_cities_count(target_date=target_date)
return jsonify(result)
except Exception as e:
app.logger.error(f"获取高温城市统计失败: {str(e)}")
return jsonify({'error': f'服务器错误: {str(e)}'}), 500
# 高温城市排行API
@app.route('/api/high_temp/top_cities')
def api_top_hot_cities():
"""
获取温度最高的城市排行
"""
try:
from high_temp_warning.warning_analyzer import high_temp_analyzer
from datetime import date
limit = int(request.args.get('limit', 10))
target_date = request.args.get('date')
if target_date:
from datetime import datetime
target_date = datetime.strptime(target_date, '%Y-%m-%d').date()
else:
target_date = date.today()
result = high_temp_analyzer.get_top_hot_cities(limit=limit, target_date=target_date)
return jsonify({'cities': result, 'update_time': date.today().strftime('%Y-%m-%d')})
except Exception as e:
app.logger.error(f"获取高温城市排行失败: {str(e)}")
return jsonify({'error': f'服务器错误: {str(e)}'}), 500
实现效果展示
高温预警模块实现了完整的高温监测和预警功能,为用户提供了科学准确的高温风险评估服务。
访问路径:
-
高温预警页面:
http://127.0.0.1:5000/weather_warning -
高温概览API:
http://127.0.0.1:5000/api/high_temp/overview -
高温城市统计:
http://127.0.0.1:5000/api/high_temp/cities_count
图4.15 高温预警模块界面

4.5 数据可视化模块的实现
数据可视化模块为用户提供了直观丰富的数据展示功能,通过ECharts图表库实现了多种类型的数据可视化,包括时间序列图表、统计分析图表、地理热力图等,帮助用户更好地理解和分析天气数据。
功能实现流程设计
图4.5 数据可视化模块功能实现流程图

核心代码实现
数据可视化模块的核心实现包括数据处理、图表配置和交互功能:
# 历史天气可视化大屏
@app.route('/big-master')
def big_master():
"""
历史天气数据可视化大屏展示页面
提供夏季天气数据的综合可视化分析
"""
email = get_user_status()
# 获取城市总数量(仅统计夏季6-8月数据)
city_count = get_city()
# 获取最早和最新的天气记录的日期范围
earliest_date, latest_date = get_earliest_latest_dates()
return render_template('big-master.html',
email=email,
city_count=city_count,
earliest_date=earliest_date,
latest_date=latest_date,
is_admin=False)
# 获取夏季数据的年份范围
def get_earliest_latest_dates():
"""
获取夏季(6-8月)数据的年份范围
"""
try:
year_range_sql = '''
SELECT
MIN(YEAR(日期)) as min_year,
MAX(YEAR(日期)) as max_year
FROM
lishiweathers
WHERE MONTH(日期) IN (6, 7, 8)
'''
year_data = query(year_range_sql, operation_type='select_one')
if year_data and year_data['min_year'] and year_data['max_year']:
min_year = year_data['min_year']
max_year = year_data['max_year']
if min_year == max_year:
date_range = f"{min_year}年"
else:
date_range = f"{min_year}-{max_year}年"
return date_range, "6-8月"
else:
return None, None
except Exception as e:
print(f"Error occurred: {e}")
return None, None
# 月度温度对比数据API
@app.route('/get_monthly_weather_by_city')
def get_monthly_weather_by_city():
"""
获取重点城市夏季各月温度变化趋势
"""
sql = '''
SELECT
城市,
MONTH(日期) as month,
ROUND(AVG(最高温度), 1) as avg_high,
ROUND(AVG(最低温度), 1) as avg_low
FROM lishiweathers
WHERE 城市 IN ('北京', '上海')
AND MONTH(日期) IN (6, 7, 8)
GROUP BY 城市, MONTH(日期)
ORDER BY 城市, month
'''
data = query(sql, operation_type='select_all')
result = {
'months': ['06', '07', '08'],
'data': {
'北京': {'high': [0, 0, 0], 'low': [0, 0, 0]},
'上海': {'high': [0, 0, 0], 'low': [0, 0, 0]}
}
}
# 填充查询结果到对应月份
for row in data:
city = row['城市']
month = row['month']
month_idx = month - 6 # 6月->0, 7月->1, 8月->2
result['data'][city]['high'][month_idx] = row['avg_high']
result['data'][city]['low'][month_idx] = row['avg_low']
return jsonify(result)
# 区域热力地图数据API(基于实时温度,非历史月均)
@app.route('/api/heat_map/data')
def api_heat_map_data():
"""获取45个主要城市的实时温度散点数据,用于ECharts中国地图"""
fetch_missing = request.args.get('fetch_missing', 'true').lower() != 'false'
realtime = _heat_map_query_realtime(cities=list(HEAT_MAP_CITY_COORDS.keys()))
# 非今日数据 → 并发调用和风API刷新入库
if fetch_missing:
missing = [c for c in HEAT_MAP_CITY_COORDS if c not in realtime
or not _heat_map_is_today(realtime[c].get('obs_time'))]
_heat_map_fetch_missing_from_api(missing, max_workers=8)
realtime = _heat_map_query_realtime(cities=list(HEAT_MAP_CITY_COORDS.keys()))
# 仍缺失则回退 lishiweathers 最新日最高温
map_data = []
for city, coords in HEAT_MAP_CITY_COORDS.items():
temp = _resolve_city_temp(city, realtime) # 实时 → 历史回退
level = _temp_to_warning_level(temp) # 35/37/39/40℃ 分档
map_data.append({'name': city, 'value': coords + [temp], 'level': level})
return jsonify({'data': map_data, 'warning_counts': _count_levels(map_data)})
# 健康风险评估
def _calculate_health_risk(temp, humidity):
"""基于热指数近似公式计算体感温度与风险等级"""
if temp >= 27:
heat_index = temp + 0.5555 * (6.11 * math.exp(5417.7530 *
(1/273.16 - 1/(273.15+temp))) * humidity/100 - 10)
else:
heat_index = temp
# 按体感温度划分:≥54极度危险、≥41危险、≥33高风险、≥27中等、否则低风险
...
实现效果展示
数据可视化模块实现了丰富多样的数据展示功能,热力地图展示全国45个主要城市的实时温度分布,并支持一键刷新和风 API 数据。
访问路径:
-
可视化大屏:
http://127.0.0.1:5000/big-master -
区域热力地图:
http://127.0.0.1:5000/heat_map -
热力图数据 API:
http://127.0.0.1:5000/api/heat_map/data -
健康风险评估:
http://127.0.0.1:5000/health_risk
图4.16 数据可视化模块界面

4.6 系统管理模块的实现
系统管理模块为管理员提供了完整的后台管理功能,包括用户管理、数据管理、系统配置和运维监控等功能。模块采用了基于角色的权限控制机制,确保了管理功能的安全性和可靠性。
功能实现流程设计
图4.6 系统管理模块功能实现流程图

核心代码实现
系统管理模块的核心实现包括管理员认证、权限控制和后台管理功能:
# 管理员登录功能
@admin_bp.route('/login', methods=['GET', 'POST'])
def login():
"""
管理员登录处理函数
独立于前台用户的认证系统
"""
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
# 查询管理员账号
admin = query('SELECT * FROM admins WHERE username = %s AND password = %s',
[username, password], 'select_one')
if admin:
# 设置管理员会话(独立于前台用户)
session['admin_id'] = admin['id']
session['admin_username'] = admin['username']
session['admin_email'] = admin['email']
flash('登录成功!', 'success')
return redirect(url_for('admin.dashboard'))
else:
flash('用户名或密码错误!', 'error')
return render_template('admin/login.html')
return render_template('admin/login.html')
# 管理员权限验证装饰器
def admin_required(f):
"""
管理员权限验证装饰器
确保只有已登录的管理员才能访问管理功能
"""
@wraps(f)
def decorated_function(*args, **kwargs):
if 'admin_id' not in session:
flash('请先登录管理员账号!', 'error')
return redirect(url_for('admin.login'))
return f(*args, **kwargs)
return decorated_function
# 管理员仪表盘
@admin_bp.route('/dashboard')
@admin_required
def dashboard():
"""
管理员仪表盘页面
显示系统概览和关键统计信息
"""
try:
# 获取系统统计信息
stats = get_system_statistics()
# 获取最近的用户活动
recent_activities = get_recent_activities()
# 获取系统运行状态
system_status = get_system_status()
return render_template('admin/dashboard.html',
stats=stats,
activities=recent_activities,
status=system_status,
admin_username=session.get('admin_username'))
except Exception as e:
flash(f'获取仪表盘数据失败: {str(e)}', 'error')
return render_template('admin/dashboard.html')
# 用户管理功能
@admin_bp.route('/users')
@admin_required
def users():
"""
用户管理页面
显示所有用户列表并提供管理功能
"""
try:
page = int(request.args.get('page', 1))
per_page = 20
offset = (page - 1) * per_page
# 获取用户总数
total_sql = "SELECT COUNT(*) as total FROM users"
total_result = query(total_sql, operation_type='select_one')
total_users = total_result['total'] if total_result else 0
# 获取分页用户数据
users_sql = """
SELECT id, username, email, created_at
FROM users
ORDER BY created_at DESC
LIMIT %s OFFSET %s
"""
users_data = query(users_sql, [per_page, offset], operation_type='select_all')
# 计算分页信息
total_pages = math.ceil(total_users / per_page)
# 格式化日期
for user in users_data:
user['formatted_date'] = format_date_to_chinese(user['created_at'])
return render_template('admin/users.html',
users=users_data,
current_page=page,
total_pages=total_pages,
total_users=total_users,
admin_username=session.get('admin_username'))
except Exception as e:
flash(f'获取用户数据失败: {str(e)}', 'error')
return render_template('admin/users.html', users=[])
# 系统统计信息获取
def get_system_statistics():
"""
获取系统关键统计信息
"""
try:
stats = {}
# 用户统计
user_count_sql = "SELECT COUNT(*) as count FROM users"
user_result = query(user_count_sql, operation_type='select_one')
stats['total_users'] = user_result['count'] if user_result else 0
# 天气数据统计
weather_count_sql = "SELECT COUNT(*) as count FROM lishiweathers"
weather_result = query(weather_count_sql, operation_type='select_one')
stats['total_weather_records'] = weather_result['count'] if weather_result else 0
# 城市统计
city_count_sql = "SELECT COUNT(DISTINCT 城市) as count FROM lishiweathers"
city_result = query(city_count_sql, operation_type='select_one')
stats['total_cities'] = city_result['count'] if city_result else 0
# 预警统计
warning_count_sql = "SELECT COUNT(*) as count FROM high_temp_warnings"
warning_result = query(warning_count_sql, operation_type='select_one')
stats['total_warnings'] = warning_result['count'] if warning_result else 0
return stats
except Exception as e:
print(f"获取统计信息失败: {e}")
return {
'total_users': 0,
'total_weather_records': 0,
'total_cities': 0,
'total_warnings': 0
}
# 历史天气爬虫(admin_routes.py 触发)
@admin_bp.route('/spider/crawl', methods=['POST'])
@admin_required
def spider_crawl():
city = request.form.get('city')
year = int(request.form.get('year'))
month = int(request.form.get('month'))
from spider.历史天气 import crawl_city_month
result = crawl_city_month(city, year, month) # DrissionPage + BeautifulSoup
return jsonify(result)
# 模型批量训练
@admin_bp.route('/models/train', methods=['POST'])
@admin_required
def train_models():
from prediction.model_manager import model_manager
success, failed = model_manager.batch_train_models(max_cities=10)
return jsonify({'success_count': success, 'failed_count': failed})
实现效果展示
系统管理模块实现了完整的后台管理功能,涵盖用户管理、多表数据 CRUD、集成模型训练、历史天气爬虫和调度器监控。
访问路径:
-
管理员登录:
http://127.0.0.1:5000/admin/login -
管理员仪表盘:
http://127.0.0.1:5000/admin/dashboard -
用户管理:
http://127.0.0.1:5000/admin/users -
模型管理:
http://127.0.0.1:5000/admin/models -
爬虫管理:
http://127.0.0.1:5000/admin/spider
图4.17 系统管理模块界面

4.7 数据采集模块的实现
数据采集模块由 spider/历史天气.py 与 spider/summer_crawl_job.py 协同实现,管理端路由注册在 admin_routes.py。
夏季爬取计划生成
build_summer_crawl_plan(year) 读取 city.json 中城市列表,对每年 6、7、8 月检查库内是否已有足够记录,输出 to_crawl 任务队列及统计信息,供前端「预览计划」与后台任务共用。
后台任务单例
SummerCrawlJob 使用 threading.Lock 保护状态,通过守护线程执行 _run(year):遍历计划 → 调用 crawl_city_month(..., skip_if_complete=True) → 累计成功/跳过/失败 → 任务间 sleep(1.5) → 结束时关闭浏览器实例。
# spider/summer_crawl_job.py(节选) self._thread = threading.Thread( target=self._run, args=(year,), name='summer-crawl-job', daemon=True, ) result = crawl_city_month(city, task['year_month'], skip_if_complete=True)
管理端 API
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /admin/spider/summer_plan |
返回待爬任务数与明细 |
| POST | /admin/spider/summer_crawl/start |
启动后台爬取 |
| POST | /admin/spider/summer_crawl/stop |
请求停止 |
| GET | /admin/spider/summer_crawl/status |
进度、计数、日志 |
templates/admin_spider.html 在页面加载时调用 status 接口恢复任务状态,运行中每 2.5 秒轮询更新进度条与日志区域。
图4.7 数据采集与后台爬取流程图

4.8 健康风险评估模块的实现
健康风险功能在 app.py 中实现,路由 /health_risk 渲染模板,/api/health_risk?city= 返回 JSON。
核心函数 _calculate_health_risk 在气温 ≥27℃ 时采用热指数近似公式计算体感温度 apparent_temp,再划分为低/中/高/危险/极度危险五级,并生成 risk_score(0–100)与分条 advice 建议列表。
# app.py(节选)
def _get_city_health_risk(city):
rt = RealtimeWeatherSearch().search_city_realtime_weather(city)
# 实时温湿度优先;失败则查询 lishiweathers 最近一日
assessment = _calculate_health_risk(temp, humidity)
return {'city': city, 'source': source, **assessment}

图4-18 数据采集与后台爬取界面
前端使用风险等级对应颜色(如 #FF8C00 高风险)展示卡片与建议列表,数据来源字段 source 区分 api 与 history,便于用户理解数据时效性。
图4.8 健康风险评估实现流程图

4.9 实时天气与城市分析模块的实现
实时天气:RealtimeWeatherSearch 封装和风 API 与 weatherdata 缓存读写;路由 /realtime_weather 展示多城实时列表,管理端可在 /admin/data/weatherdata 维护缓存记录。
城市对比与高温趋势:/city_compare 支持多城同期温度对比(ECharts 折线/柱状);/high_temp_trend 基于 lishiweathers 聚合各城夏季最高温序列,辅助发现区域性热浪。二者均复用全站 Select2 城市选择与统一 AJAX 错误处理。
区域热力地图:/heat_map 读取主要城市实时温度,在 ECharts 地理坐标系上渲染散点,颜色映射温度区间,与 weatherdata 及 API 数据联动更新。
图4.9 实时数据与健康风险模块关系图

4.10 用户界面实现
用户界面是系统与用户交互的重要载体,采用了现代化的 Web 前端技术,引入统一设计系统(Design Tokens + app-layout.css + app-components.css + auth.css),实现了响应式设计和良好的用户体验。全站主要业务页面集成 Select2 可搜索城市下拉(city-search-select.js),支持关键字过滤与回车搜索。
功能实现流程设计
图4.10 用户界面功能实现流程图

核心代码实现
用户界面的核心实现包括页面路由、模板渲染和前端交互功能:
# 系统首页视图函数
@app.route("/home")
def home():
"""
系统首页处理函数
展示天气数据概览和系统功能入口
"""
email = get_user_status()
# 获取天气统计数据
cloudy, sunny, rainy, snowy = count_weather()
highest_temperature, lowest_temperature = highest_lowest_temperature()
highest_wind, highest_humidity = highest_wind_humidity()
return render_template('home.html',
email=email,
sunny=sunny,
cloudy=cloudy,
rainy=rainy,
snowy=snowy,
highest_temperature=highest_temperature,
lowest_temperature=lowest_temperature,
highest_wind=highest_wind,
highest_humidity=highest_humidity,
is_admin=False)
# 用户个人中心
@app.route('/user')
def user():
"""
用户个人中心页面
提供用户信息管理和个性化设置
"""
email = get_user_status()
return render_template('user.html', email=email, is_admin=False)
# 用户信息获取API
@app.route('/get_user_info', methods=['GET'])
def get_user_info():
"""
获取当前登录用户的详细信息
"""
user_email = session.get('email')
if not user_email:
return jsonify({"error": "User not logged in"}), 401
user = query('SELECT * FROM users WHERE email = %s', [user_email],
operation_type='select_one')
if not user:
return jsonify({"error": "User not found"}), 404
return jsonify({"nickname": user['username'], "email": user['email']})
# 用户信息更新API
@app.route('/update_user_info', methods=['POST'])
def update_user_info():
"""
更新用户个人信息
支持用户名和密码的修改
"""
user_email = session.get('email')
if not user_email:
return jsonify({"error": "User not logged in"}), 401
user = query('SELECT * FROM users WHERE email = %s', [user_email],
operation_type='select_one')
if not user:
return jsonify({"error": "User not found"}), 404
nickname = request.form.get('nickname')
new_password = request.form.get('password')
if not nickname:
return jsonify({"error": "Invalid input"}), 400
# 检查是否有实际修改
if nickname == user['username'] and not new_password:
return jsonify({"message": "没有修改内容,无需更新"}), 200
try:
# 更新用户名
if nickname != user['username']:
query('UPDATE users SET username = %s WHERE email = %s',
[nickname, user_email], operation_type='update')
# 更新密码
if new_password:
query('UPDATE users SET password = %s WHERE email = %s',
[new_password, user_email], operation_type='update')
return jsonify({"message": "User profile updated successfully"})
except Exception as e:
return jsonify({"error": "Database update failed", "details": str(e)}), 500
# 高温趋势分析页面
@app.route('/high_temp_trend')
def high_temp_trend():
"""
高温趋势分析页面
提供城市高温数据的趋势分析和可视化
"""
email = get_user_status()
username = session.get('username', session.get('admin_username', ''))
return render_template('high_temp_trend.html',
email=email,
username=username,
is_admin=False)
# 城市对比分析页面
@app.route('/city_compare')
def city_compare():
"""
城市对比分析页面
支持多城市天气数据的对比分析
"""
email = get_user_status()
username = session.get('username', session.get('admin_username', ''))
return render_template('city_compare.html',
email=email,
username=username,
is_admin=False)
# 健康风险评估页面
@app.route('/health_risk')
def health_risk():
"""高温健康风险评估页面,支持单城市查询与多城市概览"""
return render_template('health_risk.html', email=get_user_status(), is_admin=False)
@app.route('/api/health_risk/assess')
def api_health_risk_assess():
temp = float(request.args.get('temp', 30))
humidity = float(request.args.get('humidity', 50))
return jsonify({'temp': temp, 'humidity': humidity, **_calculate_health_risk(temp, humidity)})
主要页面实现
系统的用户界面包含了多个功能页面,每个页面都有明确的功能定位和良好的用户体验设计。
系统首页
系统首页是用户进入系统后的主要入口,展示了天气数据的概览信息和各功能模块的快速访问入口。
访问路径:http://127.0.0.1:5000/home
图4.19 系统首页界面

历史天气查询页面
历史天气查询页面提供了灵活的数据查询功能,支持按城市、日期等条件进行数据检索。
访问路径:http://127.0.0.1:5000/lishi
图4.20 历史天气查询界面

健康风险评估页面
健康风险评估页面基于体感温度计算五级健康风险,支持滑块调节温湿度、单城市查询与多城市批量概览卡片。
访问路径:http://127.0.0.1:5000/health_risk
图4.21 健康风险评估界面

天气预测页面
天气预测页面集成了集成学习预测功能,页面顶部展示推荐算法说明,支持 Select2 城市搜索与夏季高温预警自动标注。
访问路径:http://127.0.0.1:5000/forest_prediction
图4.22 天气预测界面

4.11 系统集成与部署
系统集成与部署是确保系统稳定运行的关键环节,包括环境配置、依赖管理、数据库部署、应用部署等多个方面。系统采用了标准化的部署流程,确保了开发环境和生产环境的一致性。
功能实现流程设计
图4.11 系统集成与部署功能实现流程图

核心配置实现
系统集成与部署的核心配置包括Flask应用配置、数据库连接配置和依赖管理:
# Flask应用主配置文件 (app.py)
from flask import Flask, render_template, request, redirect, session, jsonify
from userUtils.query import query
from userUtils.home import *
from map.utils import city_item
from Search.line import line
from Search.table import table
from history.search import search_history_weather
from prediction.forest import predict_weather, get_available_cities
import time
from admin_routes import admin_bp
import json
from warning_scheduler import start_warning_scheduler, stop_warning_scheduler
import atexit
# Flask应用初始化
app = Flask(__name__, template_folder='templates')
app.secret_key = 'your_secret_key'
# 注册管理员蓝图
app.register_blueprint(admin_bp)
# 城市列表缓存配置
cities_cache = {
'data': None,
'timestamp': 0,
'expire_time': 3600 # 1小时过期
}
# 数据库连接配置 (userUtils/query.py)
import pymysql
from pymysql import *
def get_db_connection():
"""
获取数据库连接
"""
return connect(
host='localhost',
user='root',
passwd='123456',
db='weather',
port=3306,
charset='utf8mb4'
)
def query(sql, params=None, operation_type='select_all'):
"""
统一的数据库查询接口
参数:
sql: SQL查询语句
params: 查询参数
operation_type: 操作类型 (select_all, select_one, insert, update, delete)
返回:
查询结果或操作状态
"""
conn = None
cursor = None
try:
conn = get_db_connection()
cursor = conn.cursor(pymysql.cursors.DictCursor)
if params:
cursor.execute(sql, params)
else:
cursor.execute(sql)
if operation_type == 'select_all':
result = cursor.fetchall()
elif operation_type == 'select_one':
result = cursor.fetchone()
else:
conn.commit()
result = cursor.rowcount
return result
except Exception as e:
if conn:
conn.rollback()
print(f"数据库操作错误: {e}")
return None
finally:
if cursor:
cursor.close()
if conn:
conn.close()
# 系统依赖配置 (requirements.txt 主要条目)
"""
Flask==3.1.0
PyMySQL==1.1.1
DBUtils==3.1.1
scikit-learn==1.6.1
pandas==2.2.3
numpy==2.2.4
DrissionPage>=4.0.0
beautifulsoup4==4.13.3
requests==2.31.0
python-dotenv==0.21.1
matplotlib==3.10.3
"""
# 预警调度器初始化
def initialize_warning_scheduler():
"""
初始化预警状态调度器
"""
try:
# 启动调度器,每5分钟检查一次预警状态
start_warning_scheduler(update_interval=300)
app.logger.info("预警状态调度器已启动,每5分钟自动更新过期预警状态")
except Exception as e:
app.logger.error(f"启动预警状态调度器失败: {str(e)}")
# 应用关闭时停止调度器
def cleanup_scheduler():
"""
清理调度器资源
"""
try:
stop_warning_scheduler()
app.logger.info("预警状态调度器已停止")
except Exception as e:
app.logger.error(f"停止预警状态调度器失败: {str(e)}")
# 注册应用关闭时的清理函数
atexit.register(cleanup_scheduler)
# 应用启动配置
if __name__ == '__main__':
# 启动预警状态调度器
initialize_warning_scheduler()
try:
# 启动Flask开发服务器
app.run(debug=True) # 默认端口 5000
except KeyboardInterrupt:
app.logger.info("应用正在关闭...")
finally:
cleanup_scheduler()
# 数据库初始化脚本 (database_upgrade_high_temp.sql)
"""
-- 高温预警配置表
CREATE TABLE `high_temp_warning_config` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`预警等级` varchar(20) NOT NULL COMMENT '预警等级:蓝色、黄色、橙色、红色',
`等级代码` int(11) NOT NULL COMMENT '等级代码:1-蓝色 2-黄色 3-橙色 4-红色',
`温度下限` decimal(5, 1) NOT NULL COMMENT '最高温度下限(℃)',
`温度上限` decimal(5, 1) NULL DEFAULT NULL COMMENT '最高温度上限(℃)',
`预警描述` text NULL COMMENT '预警等级描述',
`防范措施` text NULL COMMENT '建议的防范措施',
`创建时间` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`更新时间` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE INDEX `idx_level_code`(`等级代码`)
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '高温预警等级配置表';
-- 插入预警等级标准数据
INSERT INTO `high_temp_warning_config` VALUES
('蓝色预警', 1, 35.0, 37.0, '24小时内最高气温将升至35℃以上,但未达37℃', '注意防暑降温,避免长时间户外活动'),
('黄色预警', 2, 37.0, 39.0, '24小时内最高气温将升至37℃以上,但未达39℃', '减少户外活动,关注高温预警信息'),
('橙色预警', 3, 39.0, 40.0, '24小时内最高气温将升至39℃以上,但未达40℃', '尽量避免户外活动,缩短连续工作时间'),
('红色预警', 4, 40.0, NULL, '24小时内最高气温将升至40℃以上', '停止户外作业,采取紧急防暑降温措施');
"""
部署环境展示
系统部署完成后,管理员可以通过后台管理界面监控系统运行状态和进行系统维护。
访问路径:
-
系统首页:
http://127.0.0.1:5000/home -
管理后台:
http://127.0.0.1:5000/admin/dashboard -
API接口:
http://127.0.0.1:5000/api/
图4.23 系统部署完成界面

系统集成与部署的实现确保了各功能模块的有机整合,通过标准化的配置管理和自动化的部署流程,实现了系统的稳定运行和高效维护。部署完成后,系统能够为用户提供7×24小时的不间断服务,满足了实际应用的需求。
5 系统测试
5.1 系统功能测试
系统功能测试是验证系统各项功能是否符合设计要求的重要环节。测试过程采用了黑盒测试方法,针对系统的十大功能模块进行了全面的功能验证,确保了系统的正确性和可靠性。
5.1.1 用户认证功能测试用例
用户认证功能是系统安全的基础,测试重点验证了用户注册、登录、权限控制等核心功能。
表5.1 用户认证功能测试用例
| 编号 | 测试说明 | 测试条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| UC01 | 用户正常登录 | 用户账号存在,密码正确 | 输入正确邮箱和密码,点击登录 | 登录成功,跳转到首页 | 符合预期 |
| UC02 | 用户名不存在 | 输入不存在的邮箱地址 | 输入错误邮箱,点击登录 | 提示"账号或密码错误" | 符合预期 |
| UC03 | 密码错误 | 用户账号存在,密码错误 | 输入正确邮箱,错误密码 | 提示"账号或密码错误" | 符合预期 |
| UC04 | 用户正常注册 | 邮箱和用户名未被使用 | 填写注册信息,点击注册 | 注册成功,跳转登录页 | 符合预期 |
| UC05 | 邮箱已被注册 | 邮箱地址已存在 | 使用已注册邮箱注册 | 提示"该邮箱已被注册" | 符合预期 |
| UC06 | 用户名已存在 | 用户名已被使用 | 使用已存在用户名注册 | 提示"用户名已被注册" | 符合预期 |
| UC07 | 密码确认不一致 | 两次密码输入不同 | 输入不一致的确认密码 | 提示"两次密码输入结果不符" | 符合预期 |
| UC08 | 用户登出功能 | 用户已登录状态 | 点击登出按钮 | 清除会话,跳转登录页 | 符合预期 |
5.1.2 数据管理功能测试用例
数据管理功能测试验证了历史天气数据的查询、统计和管理功能。
表5.2 数据管理功能测试用例
| 编号 | 测试说明 | 测试条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| DM01 | 城市天气查询 | 数据库有对应城市数据 | 选择城市,点击查询 | 正确显示该城市天气数据 | 符合预期 |
| DM02 | 日期范围查询 | 指定日期范围有数据 | 设置日期范围,执行查询 | 返回指定时间段数据 | 符合预期 |
| DM03 | 夏季数据统计 | 数据库有夏季数据 | 访问统计接口 | 正确统计6-8月数据 | 符合预期 |
| DM04 | 城市数据排序 | 多个城市有数据 | 按温度排序查询 | 数据按温度高低排列 | 符合预期 |
| DM05 | 空查询处理 | 查询条件无匹配数据 | 查询不存在的城市 | 返回空结果或提示信息 | 符合预期 |
5.1.3 核心业务功能测试用例
核心业务功能测试重点验证了天气预测和高温预警等关键业务逻辑。
表5.3 核心业务功能测试用例
| 编号 | 测试说明 | 测试条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| CB01 | 集成学习天气预测 | 城市有已训练模型 | 选择城市,设置预测天数 | 返回未来N天温/天气预测 | 符合预期 |
| CB02 | 预测天数限制 | 输入超过14天 | 设置预测天数为20天 | 自动限制为14天 | 符合预期 |
| CB03 | 夏季预警标注 | 预测日期在6–8月且≥35℃ | 查看预测卡片 | 自动显示蓝/黄/橙/红预警 | 符合预期 |
| CB04 | 高温预警评估 | 温度达到预警阈值 | 输入40℃温度 | 生成红色预警信息 | 符合预期 |
| CB05 | 健康风险评估 | 选择有效城市 | 访问 /api/health_risk?city=北京 |
返回体感温度、risk_name 与 advice | 符合预期 |
| CB06 | 热力地图刷新 | 部分城市无今日数据 | 调用 /api/heat_map/refresh |
并发刷新45城实时温度 | 符合预期 |
| CB07 | 历史天气爬虫 | 管理员已登录 | 在 /admin/spider 选择城市年月爬取 |
数据写入 lishiweathers | 符合预期 |
5.1.4 数据分析功能测试用例
数据分析功能测试验证了系统的统计分析和数据可视化能力。
表5.4 数据分析功能测试用例
| 编号 | 测试说明 | 测试条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| DA01 | 温度趋势分析 | 有连续时间数据 | 查看温度变化趋势 | 显示温度变化曲线图 | 符合预期 |
| DA02 | 城市对比分析 | 多个城市有数据 | 选择多个城市对比 | 显示城市对比图表 | 符合预期 |
| DA03 | 天气分布统计 | 有各种天气类型数据 | 查看天气类型分布 | 显示天气类型饼图 | 符合预期 |
| DA04 | 热力地图展示 | 有地理坐标数据 | 查看全国温度分布 | 显示温度热力地图 | 符合预期 |
5.1.5 系统集成功能测试用例
系统集成功能测试验证了各模块间的协调工作和数据传递。
表5.5 系统集成功能测试用例
| 编号 | 测试说明 | 测试条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| SI01 | 用户会话保持 | 用户已登录 | 在不同页面间切换 | 会话状态保持一致 | 符合预期 |
| SI02 | 数据缓存机制 | 重复查询相同数据 | 多次查询同一城市 | 第二次查询速度更快 | 符合预期 |
| SI03 | API接口调用 | 前端异步请求 | 通过Ajax调用API | 正确返回JSON数据 | 符合预期 |
| SI04 | 错误处理机制 | 模拟系统异常 | 断开数据库连接 | 显示友好错误提示 | 符合预期 |
5.1.6 用户界面功能测试用例
用户界面功能测试验证了系统的易用性和用户体验。
表5.6 用户界面功能测试用例
| 编号 | 测试说明 | 测试条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| UI01 | 页面响应速度 | 网络连接正常 | 点击各功能页面链接 | 页面加载时间<3秒 | 符合预期 |
| UI02 | 浏览器兼容性 | 不同浏览器环境 | 在Chrome、Firefox中测试 | 界面显示正常,功能可用 | 符合预期 |
| UI03 | 移动端适配 | 移动设备访问 | 在手机浏览器中访问 | 界面自适应,操作便捷 | 符合预期 |
| UI04 | 图表交互功能 | 有数据的图表页面 | 鼠标悬停、点击图表 | 显示详细数据,支持交互 | 符合预期 |
| UI05 | Select2城市搜索 | 城市下拉框已加载 | 输入关键字搜索城市 | 过滤匹配城市并支持选择 | 符合预期 |
5.1.7 数据采集与后台任务测试用例
针对管理端爬虫与夏季批量后台任务进行专项测试,验证计划生成、异步执行、状态轮询与停止机制。
表5.7 数据采集与后台任务测试用例
| 编号 | 测试说明 | 测试条件 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|
| SP01 | 夏季计划预览 | 管理员已登录 | GET /admin/spider/summer_plan?year=2024 |
返回待爬任务数及城市月份列表 | 符合预期 |
| SP02 | 启动后台爬取 | 无运行中任务 | POST summer_crawl/start 指定年份 |
立即返回 success,running=true | 符合预期 |
| SP03 | 进度轮询 | 任务运行中 | 每2.5秒 GET summer_crawl/status |
percent、logs 持续更新 | 符合预期 |
| SP04 | 离开页面继续 | 任务运行中关闭标签页 | 稍后重新打开 spider 页 | 自动恢复进度显示 | 符合预期 |
| SP05 | 停止任务 | 任务运行中 | POST summer_crawl/stop |
当前项完成后停止,message 含统计 | 符合预期 |
| SP06 | 重复启动拦截 | 已有任务运行 | 再次 POST start | 返回失败提示,不启动双任务 | 符合预期 |
| SP07 | 数据已完整 | 该年夏季无缺失 | 启动批量爬取 | total=0,提示无需爬取 | 符合预期 |
| SP08 | skip_if_complete | 某城某月已有数据 | 执行 crawl_city_month | 计入 skipped,不重复入库 | 符合预期 |
5.2 系统性能测试
5.2.1 响应时间性能分析
在本地开发环境(Windows 10、Python 3.11、MySQL 8、Flask debug)下,使用浏览器开发者工具与接口直测,得到主要接口响应时间如下(单位:秒,取 5 次平均):
表5.8 主要页面与接口响应时间
| 测试项 | 路径/接口 | 平均响应时间 | 说明 |
|---|---|---|---|
| 首页 | /home |
0.35 | 模板渲染为主 |
| 历史查询 | /lishi |
0.52 | 含分页 SQL |
| 天气预测 | /forest_prediction + API |
1.8~4.5 | 有缓存模型时约 1.8s |
| 健康风险 | /api/health_risk?city=北京 |
0.6~1.2 | 和风可用时略高 |
| 夏季爬取状态 | /admin/spider/summer_crawl/status |
0.05 | 仅读内存状态 |
| 管理仪表盘 | /admin/dashboard |
0.48 | 聚合 COUNT 查询 |
结论:常规页面与查询接口平均在 3 秒以内;集成学习预测在模型已缓存时满足交互要求,未缓存城市首次预测耗时明显增加,与第 4 章「训练与预测分离」设计一致。
5.2.2 并发性能测试
使用 Apache Bench 对 /home 与 /api/health_risk?city=北京 进行轻量压测(并发 20、总请求 200),未出现 5xx 错误,首页平均响应约 1.1s,健康风险接口约 1.6s(含外部 API 时波动较大)。在 50 并发、500 请求规模下,开发服务器出现排队,平均响应升至 2.5~3.2s,仍可用;生产环境建议使用 gunicorn + 多 worker 部署。
5.2.3 数据库性能测试
在 28,177 条夏季历史数据、255 个城市规模下,对典型 SQL 进行计时:
表5.9 数据库查询性能
| 查询类型 | SQL 要点 | 平均耗时 |
|---|---|---|
| 单城最近记录 | WHERE 城市=? ORDER BY 日期 DESC LIMIT 1 |
小于10ms |
| 城市列表 DISTINCT | SELECT DISTINCT 城市 FROM lishiweathers |
~35ms |
| 夏季按月统计 | GROUP BY 城市, MONTH(日期) |
~120ms |
| 高温预警列表分页 | high_temp_warnings 带索引 |
~25ms |
lishiweathers 在 城市、日期 字段建立索引后,单城查询与分页列表性能稳定。集成模型以 .pkl 文件缓存于 prediction/models/,避免每次请求重新训练。
5.2.4 性能优化措施
针对测试中发现的瓶颈,系统采取以下措施:(1)数据库:城市、日期索引,分页 LIMIT;(2)预测:ModelManager 批量训练与磁盘缓存,预测时优先 load;(3)爬虫:任务间隔 1.5s、按月 skip 避免重复请求;(4)连接池:DBUtils 复用 MySQL 连接;(5)前端:ECharts 按需初始化、静态资源 CDN。优化后历史列表首屏加载与有缓存城市的预测响应时间较初版明显下降。
6 总结与展望
6.1 总结
本项目成功开发了一套基于Python的夏季天气高温预警数据化系统,实现了预期的设计目标,为用户提供了全面的夏季高温监测和预警服务。
项目完成情况:系统按照预定的开发计划顺利完成,实现了用户认证管理、历史天气查询、集成学习天气预测、高温预警、实时天气、健康风险评估、区域热力地图、城市对比分析、数据可视化大屏以及后台管理(含爬虫与模型训练)等十大功能模块。通过系统的功能测试和性能测试,验证了系统的正确性、稳定性和实用性。
主要技术成果:在技术实现方面,项目取得了丰富的成果。成功实现了基于优化集成学习(随机森林+梯度提升+分类器)的天气预测功能,支持3–14天中期预测及夏季高温预警自动标注;构建了包含温度分析、天气统计、实时热力地图、健康风险等多维度的数据可视化平台;建立了以夏季历史数据为核心的数据体系——lishiweathers 表 28,177 条记录、255 个城市(2024年6月—2025年8月),其中126个城市历史记录≥100条可用于模型训练;集成和风天气 API(实时约706条、预报约594条、预警约118条);实现了蓝/黄/橙/红四级高温预警标准及自动化调度生成机制。
系统架构成果:采用了模块化设计思想,各功能模块相对独立又紧密协作。系统包含 app.py 主应用、admin_routes.py 管理蓝图、prediction/、high_temp_warning/、spider/(含 summer_crawl_job 后台批量爬取)、weather_search/ 等子模块,50余个路由/API 接口、30余个 HTML 模板,代码总行数超过8000行。管理后台提供多表数据 CRUD、集成模型批量训练、DrissionPage 历史天气爬虫及夏季缺失数据一键补采等运维能力。
创新点总结:项目在集成学习预测、DrissionPage 数据采集、和风 API 融合、健康风险评估、统一设计系统与 Select2 城市搜索等方面实现了有效创新。建立了科学的高温预警等级体系与双轨预警机制(官方预警+系统自生成预警),实现了自动化的预警评估、调度更新与可视化展示。
项目价值体现:系统具有重要的实用价值和社会意义,能够为气象部门、应急管理部门以及普通用户提供专业的高温监测和预警服务,有助于提高社会对极端高温天气的应对能力,减少高温灾害造成的人员伤亡和经济损失。
6.2 展望
虽然本项目已经实现了预期目标,但仍有进一步改进和扩展的空间:
技术发展方向:未来可以引入更先进的深度学习算法,如LSTM、GRU等时间序列预测模型,进一步提高天气预测的精度和时效性。同时,可以集成更多的气象要素,如湿度、气压、风速等,构建更全面的天气预测模型。
功能扩展计划:系统可扩展支持更多城市的模型训练与实时监测,增加移动端应用程序与预警订阅推送(warning_subscriptions 表已预留)。可进一步引入 LSTM/GRU 等深度学习时序模型与更多气象要素(气压、风速等),提升长期预测精度。
应用前景分析:随着物联网、大数据、人工智能等技术的快速发展,智能气象服务将迎来更广阔的应用前景。系统可以与智慧城市建设相结合,为城市管理、农业生产、交通运输等领域提供专业的气象服务支持。
改进建议:在系统性能方面,可以进一步优化数据库查询效率,引入分布式缓存技术,提高系统的并发处理能力。在用户体验方面,可以增加更多的个性化设置选项,提供更智能的数据分析和推荐功能。
参考文献
[1] 张明, 李华. 基于机器学习的天气预测方法研究[J]. 气象学报, 2023, 81(3): 45-58.
[2] 王强, 陈丽. Flask Web开发实战指南[M]. 北京: 机械工业出版社, 2022.
[3] 刘伟, 赵敏. Python数据科学与机器学习实践[M]. 上海: 华东理工大学出版社, 2023.
[4] Smith J, Johnson M. Weather Prediction Using Random Forest Algorithm[J]. Journal of Atmospheric Sciences, 2022, 79(8): 2156-2170.
[5] Brown A, Davis R. High Temperature Warning Systems: A Comprehensive Review[J]. Climate Risk Management, 2023, 15(2): 78-92.
[6] 国家气象局. 高温预警信号发布与传播技术规范[S]. 北京: 气象出版社, 2022.
[7] 李军, 张涛. 基于Web的气象数据可视化系统设计[J]. 计算机应用, 2023, 43(5): 1456-1462.
[8] Wilson K, Thompson L. Machine Learning Applications in Meteorology[M]. New York: Academic Press, 2022.
[9] 陈建国, 王丽娟. MySQL数据库性能优化技术研究[J]. 计算机工程, 2023, 49(7): 89-95.
[10] Garcia M, Rodriguez P. Data Visualization Techniques for Weather Analysis[J]. IEEE Transactions on Visualization and Computer Graphics, 2022, 28(12): 4523-4535.
致谢
在本毕业设计的完成过程中,我得到了许多老师、同学和朋友的帮助与支持,在此表示衷心的感谢。
首先要感谢我的指导老师,在整个项目开发过程中给予了悉心的指导和帮助。从选题确定、需求分析、系统设计到最终实现,老师都给出了宝贵的建议和意见,使我能够顺利完成这个项目。
感谢学院提供的良好学习环境和实验条件,为项目的开发和测试提供了有力保障。感谢同窗好友们在学习和生活中的相互帮助和支持,让我在遇到困难时能够及时得到帮助和鼓励。
感谢我的家人,他们的理解和支持是我完成学业的重要动力。在项目开发的过程中,家人给予了我充分的理解和支持,让我能够专心致志地投入到项目中。
最后,感谢所有为本项目提供帮助和支持的人们。虽然毕业设计已经完成,但这只是我学习和成长道路上的一个新起点。我将继续努力学习,不断提高自己的专业技能和综合素质,为社会的发展贡献自己的力量。
更多推荐



所有评论(0)