[免费]基于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 decimal

from flask_apscheduler import APScheduler

import 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 online


class JSONEncoder(_JSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            return float(o)
        super(_JSONEncoder, self).default(o)


class Flask(_Flask):
    json_encoder = JSONEncoder


import os

app = 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'] = True
            session['account'] = account
            session['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 = 1
    return 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