[免费]基于Python的全国气象数据采集及可视化大屏系统(Flask+request库)【论文+源码+SQL脚本】
大家好,我是python222_小锋老师,看到一个不错的基于Python的全国气象数据采集及可视化大屏系统(Flask+request库),分享下哈。
项目视频演示
【免费】基于Python的全国气象数据采集及可视化大屏系统(Flask+爬虫) Python毕业设计_哔哩哔哩_bilibili
项目介绍
本研究开发了一个基于Flask框架的全国气象数据采集及可视化系统。在数字化时代背景下,针对精确及时气象服务的迫切需求,研究集成了数据爬取技术、数据库管理和可视化工具,提供了一个实时、高效和直观的气象信息平台。系统支持历史数据查询和趋势分析,为科学研究、政策制定和应急管理提供了关键数据支持。研究着眼于提升气象数据的可接入性和分析效率,展现了系统在促进科学决策、提高灾害响应能力和贡献气象科学研究方面的深远影响。
系统展示
部分代码
from flask import Flask as _Flask, flash
from flask import request, session
from flask import render_template
from flask.json import JSONEncoder as _JSONEncoder, jsonify
import decimalfrom flask_apscheduler import APSchedulerimport service.users_data as user_service
import service.weathers_data as weathers_data
import service.view_data as view_data
import service.version_data as version_data
import service.slog_data as slog_data
from spider.GetWeather import onlineclass JSONEncoder(_JSONEncoder):def default(self, o):if isinstance(o, decimal.Decimal):return float(o)super(_JSONEncoder, self).default(o)class Flask(_Flask):json_encoder = JSONEncoderimport osapp = Flask(__name__)
app.config['SESSION_TYPE'] = 'filesystem'
app.config['SECRET_KEY'] = os.urandom(24)# -------------前台可视化大数据分析相关服务接口start-----------------
# 系统默认路径前台跳转
@app.route('/')
def main_page():return render_template("main.html")# -------------前台可视化大数据分析相关服务接口end-----------------# -------------后台管理模块相关服务接口start-----------------
# 登录
@app.route('/login', methods=['POST'])
def login():if request.method == 'POST':account = request.form.get('account')password = request.form.get('password')if not all([account, password]):flash('参数不完整')return "300"res = user_service.get_user(account, password)if res and res[0][0] > 0:session['is_login'] = Truesession['account'] = accountsession['role'] = res[0][1]return "200"else:return "300"# 登录页面跳转
@app.route('/admin')
def admin():if session.get("is_login"):role = session.get('role')# print(role, type(role), 123)account = session.get('account')if role == 0:return render_template('index.html', role=role, account=account)else:return render_template('index1.html', role=role, account=account)else:return render_template('login.html')@app.route('/logout')
def logout():try:session.pop("is_login")return render_template('login.html')except Exception:return render_template('login.html')# 后台首页面跳转
@app.route('/html/welcome')
def welcome():role = session.get('role')account = session.get('account')return render_template('html/welcome.html', role=role, account=account)# 后台注册跳转
@app.route('/html/reg')
def html_reg():return render_template('reg.html')# -----------------用户管理模块START-----------------# 用户管理页面
@app.route('/html/user')
def user_manager():return render_template('html/user.html')# 获取用户数据分页
@app.route('/user/list', methods=["POST"])
def user_list():get_data = request.form.to_dict()page_size = get_data.get('page_size')page_no = get_data.get('page_no')param = get_data.get('param')data, count, page_list, max_page = user_service.get_user_list(int(page_size), int(page_no), param)return jsonify({"data": data, "count": count, "page_no": page_no, "page_list": page_list, "max_page": max_page})# 注册用户数据
@app.route('/user/reg', methods=["POST"])
def user_reg():get_data = request.form.to_dict()name = str(get_data.get('username'))account = str(get_data.get('account'))password = str(get_data.get('password'))company = "平台注册"phone = " "mail = " "type = 1return user_service.add_user(name, account, password, company, phone, mail, type)# 添加用户数据
@app.route('/user/add', methods=["POST"])
def user_add():get_data = request.form.to_dict()name = get_data.get('name')account = get_data.get('account')password = get_data.get('password')company = get_data.get('company')phone = get_data.get('phone')mail = get_data.get('mail')type = get_data.get('type')return user_service.add_user(name, account, password, company, phone, mail, type)# 修改用户数据
@app.route('/user/edit', methods=["PUT"])
def user_edit():get_data = request.form.to_dict()id = get_data.get('id')name = get_data.get('name')password = get_data.get('password')company = get_data.get('company')phone = get_data.get('phone')mail = get_data.get('mail')type = get_data.get('type')user_service.edit_user(id, name, password, company, phone, mail, type)return '200'# 删除用户数据
@app.route('/user/delete', methods=["DELETE"])
def user_delete():get_data = request.form.to_dict()id = get_data.get('id')user_service.del_user(id)return '200'# -----------------用户管理模块END-----------------# -----------------系统版本管理模块START-----------------# 系统版本管理页面
@app.route('/html/version')
def version_manager():return render_template('html/version.html')# 获取系统版本
@app.route('/version/show', methods=["POST"])
def version_show():res = version_data.get_sys_version()return jsonify({"data": res})# 获取系统版本数据分页
@app.route('/version/list', methods=["POST"])
def version_list():get_data = request.form.to_dict()page_size = get_data.get('page_size')page_no = get_data.get('page_no')param = get_data.get('param')data, count, page_list, max_page = version_data.get_sys_version_list(int(page_size), int(page_no), param)return jsonify({"data": data, "count": count, "page_no": page_no, "page_list": page_list, "max_page": max_page})# 新增系统版本数据
@app.route('/version/add', methods=["POST"])
def sys_version_add():get_data = request.form.to_dict()name = get_data.get('name')version = get_data.get('version')return version_data.add_sys_version(name, version)# 修改系统版本数据
@app.route('/version/edit', methods=["PUT"])
def version_edit():get_data = request.form.to_dict()id = get_data.get('id')name = get_data.get('name')version = get_data.get('version')version_data.edit_sys_version(id, name, version)return '200'# 删除系统版本数据
@app.route('/version/delete', methods=["DELETE"])
def version_delete():get_data = request.form.to_dict()id = get_data.get('id')version_data.del_sys_version(id)return '200'# -----------------系统版本管理模块END-----------------# -------------前台天气大数据页面相关服务接口start-----------------# 城市天气数量统计
@app.route('/main/total')
def get_total_data():return view_data.get_weathers_total_data()# 城市空气SQL数量统计
@app.route('/main/aqi')
def get_AQI_data():return view_data.get_AQI_total_data()# 城市风力分布统计
@app.route('/main/ws')
def get_ws_data():return view_data.get_ws_total_data()# 城市风向分布统计
@app.route('/main/wd')
def get_wd_data():return view_data.get_wd_total_data()# 北京实时气温以及风俗变化
@app.route('/main/bgt')
def get_bg_data():return view_data.get_bg_total_data()# 获取轮播数据
@app.route('/main/qgsk')
def get_qgsk_data():return view_data.get_qg_total_data()# -------------前台天气大数据页面相关服务接口end-----------------# -------------天气数据管理相关服务接口Start-----------------
# 天气数据管理页面
@app.route('/html/weather')
def new():return render_template('html/weathers.html')# 获取天气数据分页
@app.route('/weather/list', methods=["POST"])
def weathers_list():get_data = request.form.to_dict()page_size = get_data.get('page_size')page_no = get_data.get('page_no')param = get_data.get('param')data, count, page_list, max_page = weathers_data.get_weathers_list(int(page_size), int(page_no), param)return jsonify({"data": data, "count": count, "page_no": page_no, "page_list": page_list, "max_page": max_page})# 修改天气数据
@app.route('/weather/edit', methods=["POST"])
def old_edit():get_data = request.form.to_dict()id = get_data.get('id')temp = get_data.get('temp')wd = get_data.get('wd')ws = get_data.get('ws')wse = get_data.get('wse')sd = get_data.get('sd')weather = get_data.get('weather')aqi = get_data.get('aqi')weathers_data.edit_weathers(id, temp, wd, ws, wse, sd, weather, aqi)return '200'# 修改天气数据
@app.route('/weather/del', methods=["PUT"])
def old_del():get_data = request.form.to_dict()id = get_data.get('id')weathers_data.del_weathers(id)return '200'# -------------天气数据管理相关服务接口end-----------------from concurrent.futures import ThreadPoolExecutor# ----------------------爬虫/爬虫日志模块-开始----------------------
from concurrent.futures import ThreadPoolExecutor# 爬虫日志页面
@app.route('/html/slog')
def slog_manager():return render_template('html/slog.html')# 获取爬虫日志数据分页
@app.route('/slog/list', methods=["POST"])
def slog_list():get_data = request.form.to_dict()page_size = get_data.get('page_size')page_no = get_data.get('page_no')param = get_data.get('param')data, count, page_list, max_page = slog_data.get_slog_list(int(page_size), int(page_no), param)return jsonify({"data": data, "count": count, "page_no": page_no, "page_list": page_list, "max_page": max_page})# 修改爬虫日志数据
@app.route('/slog/edit', methods=["PUT"])
def slog_edit():get_data = request.form.to_dict()id = get_data.get('id')log = get_data.get('log')slog_data.edit_slog(id, log)return '200'# 删除爬虫日志数据
@app.route('/slog/delete', methods=["DELETE"])
def slog_delete():get_data = request.form.to_dict()id = get_data.get('id')slog_data.del_slog(id)return '200'# 后台调用爬虫
@app.route('/spider/start', methods=["POST"])
def run_spider():executor = ThreadPoolExecutor(2)executor.submit(online())return '200'# 爬虫自动运行
def job_function():print("爬虫任务执行开始!")executor = ThreadPoolExecutor(2)executor.submit(online())def task():scheduler = APScheduler()scheduler.init_app(app)# 定时任务,每隔10s执行1次scheduler.add_job(func=job_function, trigger='interval', seconds=1800, id='my_cloud_spider_id')scheduler.start()# 写在main里面,IIS不会运行
task()
# ----------------------爬虫/爬虫日志模块-结束----------------------
if __name__ == '__main__':# 端口号设置app.run(host="127.0.0.1", port=5000)
<!DOCTYPE html>
<!-- saved from url=(0049)http://www.dmaku.com/demo/moban/2018061599101559/ -->
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><!-- meta --><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="renderer" content="webkit"><meta property="qc:admins" content="23635710066417756375"><meta name="baidu-site-verification" content="QIQ6KC1oZ6"><meta content="" name="keywords"><meta content="" name="description"><meta name="viewport" content="width=device-width"><title>登录-后台管理</title><link rel="stylesheet" type="text/css" href="../static/css/dmaku2.css"><link rel="shortcut icon" href="../static/images/bl.png" type="image/x-icon"/>
</head><body><header id="header"><script type="text/javascript" src="../static/js/jquery.js"></script><a href="/" style="font-size:20px;color:#ffffff">全国气象分析平台</a><i class="icons">beta</i>
</header><!-- /header --><!-- 页面主体START -->
<section id="main"><h1>平台-登录</h1><form accept-charset="utf-8" data-view="loginView"><div class="clearfix" data-propertyname="username" data-controltype="Phone"><input type="text" placeholder="输入帐号" id="account" name="account" data-required="required"autocomplete="off"></div><div class="clearfix" data-propertyname="password" data-controltype="Password"><input type="password" name="password" id="password" placeholder="输入密码" data-required="required"autocomplete="off"></div><div class="clearfix"><label><input type="checkbox" class="autologin"/>自动登录</label><a href="/html/reg" class="forgot_pwd">注册账号</a></div><div class="clearfix btn_login" data-propertyname="submit" data-controltype="Botton"><input type="button" onclick="login()" value="登录"></div><div class="clearfix goregister"></div><input type="hidden" value="" id="isVisiable_request_form_verifyCode"></form>
</section>
<!-- 页面主体END --><footer id="footer"><div>全国气象综合分析平台</div><p>Copyright @ 2024 </p>
</footer><!-- jquery lib -->
</body>
<script src="../static/js/jquery.js"></script>
<script src="../static/lib/layer/layer.js"></script>
<script>function login() {let account = $("#account").val();let password = $("#password").val();if (account == undefined || account == "") {return layer.msg("请填写账号");}if (password == undefined || password == "") {return layer.msg("请填写密码");}$.ajax({url: "/login",data: {"account": account, "password": password},method: "POST",success: function (obj) {if (obj != "200") {layer.msg("您输入的账号或密码有误", {offset: '15px', icon: 2, time: 1500})} else {location.href = '/admin'; //后台主页.}}})}
</script>
</html>
源码下载
链接:https://pan.baidu.com/s/1sp52IgoBH3HUz-IUbSmeFg
提取码:1234