智慧天气系统 - 可视化大屏(Echarts)管理系统(HTTP(S)协议)物联网平台(MQTT协议)

news2024/12/29 9:42:11

一. 智慧天气系统功能定义

  • 天气数据实时监控,实时视频监控,历史数据分析;
  • 电子地图,设备地理位置精确定位;
  • 多级组织结构管理,满足集团大客户需求;
  • 可视化大屏展示,数据指标一目了然,彰显企业数字化建设形象;

二. 主要技术栈

  • 数据可视化Echarts;管理系统VUE框架;
  • HTTP服务Python Django ,Python Flask;
  • MQTT 物联网服务 Mosquitto;支持主流的MQTT云服务厂商对接:阿里云物联网平台,EMQ物联网平台等;
  • 数据库 Mysql;支持PostgreSQL、MySQL、Oracle、Microsoft SQL Server、SQLite等,还可以定制其它类型数据库;
  • 部署在阿里云主机;支持腾讯云主机,华为云主机,亚马逊云主机等主流云平台,或者私有化部署。

三. 可视化大屏

效果图

  

 

关键代码

http 服务器代码

# -*- coding:utf-8 -*-

import io
import os
import sys
import time
import requests
import urllib
import json

from flask import Flask
from flask import request

# 导入线程模块
import threading
# 导入数据库模块
import db
import daping
import config
from log import *

app = Flask(__name__, static_folder="static", template_folder="template")


@app.route('/')
def hello_world():
    return os.getcwd()

# 主程序在这里
if __name__ == "__main__":
    # 开启线程,触发动态数据
    a = threading.Thread(target=daping.loop)
    a.start()

    # 开启 flask 服务
    app.run(host='0.0.0.0', port=80, debug=False)

实时风向图表echarts代码

function init_echart_gauge_dir(container) {
    var chartDom = document.getElementById(container);
    var myChart = echarts.init(chartDom);
    option = {
        series: [
            {
                type: "gauge",
                radius: "60%",
                center: ["60%", "50%"],
                // startAngle: 200,
                // endAngle: -20,
                // false顺时针增长,true逆时针增长
                clockwise: true,
              
                // 0 :x横轴右向
                // startAngle: 0,
                // endAngle: 360,
                startAngle: 90,
                endAngle: 90.01,
                min: 0,
                max: 360,
                splitNumber: 8,
                axisLine: {
                    lineStyle: {
                        // width: 6,
                        // 轴线的分段颜色
                        color: [
                            [0.25, "#FF6E76"],
                            [0.5, "#FDDD60"],
                            [0.75, "#58D9F9"],
                            [1, "#7CFFB2"],
                        ],
                    },
                },
                // 标尺为红色
                itemStyle: {
                    color: "red",
                },
                progress: {
                    show: true,
                },
                // 指针
                pointer: {
                    show: true,
                    icon: "path://M12.8,0.7l12,40.1H0.7L12.8,0.7z",
                    length: "100%",
                    width: 20,
                    // 指针位置
                    offsetCenter: [0, 0],
                    itemStyle: {
                        color: "auto",
                    },
                },

                // 小刻度与坐标轴的距离
                axisTick: {
                    distance: -15,
                    splitNumber: 5,
                },
                // 分割线与坐标轴的距离
                splitLine: {
                    distance: -20,
                },
                // 刻度标签
                axisLabel: {
                    distance: -15,
                    color: "orange",
                    formatter: function (value) {
                        if (value === 0) {
                            return "北";
                        } else if (value === 45) {
                            return "东北";
                        } else if (value === 90) {
                            return "东";
                        } else if (value === 135) {
                            return "东南";
                        } else if (value === 180) {
                            return "南";
                        } else if (value === 225) {
                            return "西南";
                        } else if (value === 270) {
                            return "西";
                        } else if (value === 315) {
                            return "西北";
                        }
                        return "";
                    },
                    // formatter: "{value} °",
                },
                detail: {
                    valueAnimation: true,
                    width: "60%",
                    lineHeight: 30,
                    borderRadius: 8,
                    // data数字位置
                    offsetCenter: [0, 0],
                    // 表盘中间字体大小
                    fontSize: 14,
                    fontWeight: "normal",
                    formatter: "{value} °",
                    color: "rgba(255, 255, 255, 0)",
                },
                data: [
                    {
                        value: 3.2,
                    },
                ],
            },
        ],
    };
    window.addEventListener("resize", function () {
        myChart.resize();
    });
    myChart.setOption(option);
}

四. 管理系统

效果图

 

 

关键代码

http django服务器

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

组织管理 - django 代码

class DeptViewSet(CustomModelViewSet):
    """
    组织管理接口
    list:查询
    create:新增
    update:修改
    retrieve:单例
    destroy:删除
    """
    queryset = Dept.objects.all()
    serializer_class = DeptSerializer
    create_serializer_class = DeptCreateUpdateSerializer
    update_serializer_class = DeptCreateUpdateSerializer
    filter_fields = ['name', 'id', 'parent']
    search_fields = []

    # extra_filter_backends = []

    def list(self, request, *args, **kwargs):
        # 如果懒加载,则只返回父级
        queryset = self.filter_queryset(self.get_queryset())
        lazy = self.request.query_params.get('lazy')
        parent = self.request.query_params.get('parent')
        if lazy:
            # 如果懒加载模式,返回全部
            if not parent:
                if self.request.user.is_superuser:
                    queryset = queryset.filter(parent__isnull=True)
                else:
                    queryset = queryset.filter(id=self.request.user.dept_id)
            serializer = self.get_serializer(queryset, many=True, request=request)
            return SuccessResponse(data=serializer.data, msg="获取成功")

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True, request=request)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True, request=request)
        return SuccessResponse(data=serializer.data, msg="获取成功")

    def dept_lazy_tree(self, request, *args, **kwargs):
        parent = self.request.query_params.get('parent')
        queryset = self.filter_queryset(self.get_queryset())
        if not parent:
            if self.request.user.is_superuser:
                queryset = queryset.filter(parent__isnull=True)
            else:
                queryset = queryset.filter(id=self.request.user.dept_id)
        data = queryset.filter(status=True).order_by('sort').values('name', 'id', 'parent')
        return DetailResponse(data=data, msg="获取成功")

 组织管理 - vue 代码

<template>
  <d2-container :class="{ 'page-compact': crud.pageOptions.compact }">
    <!--    <template slot="header">测试页面1</template>-->
    <d2-crud-x ref="d2Crud" v-bind="_crudProps" v-on="_crudListeners">
      <div slot="header">
        <crud-search
          ref="search"
          :options="crud.searchOptions"
          @submit="handleSearch"
        />
        <el-button-group>
          <el-button
            size="small"
            v-permission="'Create'"
            type="primary"
            @click="addRow"
            ><i class="el-icon-plus" /> 新增</el-button
          >
        </el-button-group>
        <crud-toolbar
          :search.sync="crud.searchOptions.show"
          :compact.sync="crud.pageOptions.compact"
          :columns="crud.columns"
          @refresh="doRefresh()"
          @columns-filter-changed="handleColumnsFilterChanged"
        />
      </div>
    </d2-crud-x>
  </d2-container>
</template>

<script>
import * as api from './api'
import { crudOptions } from './crud'
import { d2CrudPlus } from 'd2-crud-plus'
export default {
  name: 'dept',
  mixins: [d2CrudPlus.crud],
  data () {
    return {}
  },
  methods: {
    getCrudOptions () {
      return crudOptions(this)
    },
    pageRequest (query) {
      query.lazy = true
      return api.GetList(query)
    },
    addRequest (row) {
      d2CrudPlus.util.dict.clear()
      return api.createObj(row)
    },
    updateRequest (row) {
      d2CrudPlus.util.dict.clear()
      return api.UpdateObj(row)
    },
    delRequest (row) {
      return api.DelObj(row.id)
    },
    // 授权
    createPermission (scope) {
      this.$router.push({
        name: 'menuButton',
        params: { id: scope.row.id },
        query: { name: scope.row.name }
      })
    }
  }
}
</script>

<style lang="scss">
.yxtInput {
  .el-form-item__label {
    color: #49a1ff;
  }
}
</style>

五. 更多系统资源

智慧农业系统 - 可视化大屏(Echarts)&管理系统(HTTP(S)协议)&物联网平台(MQTT协议)_YYDataV数据可视化的博客-CSDN博客

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/75712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端小技能:Chrome DevTools中的操作技巧

文章目录 前言I 操作技巧1.1 编辑页面上的任何文本 ✍1.2 清空缓存并硬性重新加载1.3 Command 菜单see aslo前言 Mac 使用 command+option+I 即可打开DevTools I 操作技巧 1.1 编辑页面上的任何文本 ✍ 在控制台输入document.body.contentEditable="true"开启文本…

计算机视觉 神经网络基础理论

1.感受野 输出featuremap上的一个像素点在输入图上的映射区域的大小。 计算公式&#xff1a; lk1lk[(fk1−1)∗∏i1ksi] , 为前层的步长之积∏i1ksi为前k层的步长之积第层对应的感受野大小&#xff0c;第层的卷积核的大小&#xff0c;或为池化尺寸大小lk第k层对应的感受野大小…

【C++】特殊类相关设计

前言 在实际的应用场景中&#xff0c;不免会有一些特殊的设计要求存在。在C中&#xff0c;由于三种不同的域&#xff0c;以及地址空间的大小或者申请方式不同&#xff0c;就衍生出了一些特殊的设计类方法。 何为特殊呢&#xff1f;即区别于普通类的设计。 上一篇C笔记传送门~ 【…

[附源码]计算机毕业设计的高校资源共享平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

第二证券|抗原检测板块暴涨,又是20CM涨停!

抗原检测概念起飞&#xff0c;组织以为&#xff0c;抗原检测在国内疫情防控中的重要性有望逐渐提高&#xff0c;主张重视板块潜在的市场需求。 抗原检测板块掀涨停潮 9日&#xff0c;抗原检测概念开盘冲高&#xff0c;到午间收盘&#xff0c;天瑞仪器、英诺特20CM涨停&#xf…

期权量化策略:如何利用期权捕捉期现套利机会?

做期权的朋友请看过来&#xff01;当前与掘金量化合作的特定券商已经能够支持期权数据和交易接口啦~如需开展期权量化&#xff0c;请联系我了解更多详情。 本期我们将和大家分享一个策略&#xff0c;介绍如何利用期权进行自动化套利。 期现套利是指某种期货合约&#xff0c;当…

浅谈linux 内核网络 sk_buff 之克隆与复制

【推荐阅读】 需要多久才能看完linux内核源码&#xff1f; 概述Linux内核驱动之GPIO子系统API接口 一文了解Linux内核的Oops 一篇长文叙述Linux内核虚拟地址空间的基本概括 纯干货&#xff0c;linux内存管理——内存管理架构&#xff08;建议收藏&#xff09; 1 skb_clone() 函…

1X的示波器探头为什么会降低示波器带宽

有些无源示波器探头分为1X和10X两个挡位&#xff0c;比如这个探头&#xff0c;这里有个按钮可以选择1X或者10X&#xff0c; 1X表示测量的信号不在探头衰减&#xff0c;同时示波器的通道选项也不用放大&#xff0c;10X表示测量的信号在探头衰减10倍&#xff0c;同时示波器的通道…

Spring Boot的两种配置文件

⭐️前言⭐️ Spring Boot项目中重要的数据都是在配置文件中配置的&#xff0c;下边我们就来学习SpringBoot中的配置文件的具体详情。 &#x1f349;博客主页&#xff1a; &#x1f341;【如风暖阳】&#x1f341; &#x1f349;精品Java专栏【JavaEE进阶】、【JavaEE初阶】、…

2.5D游戏,角色移动限制方法。不用空气墙。

有一个项目&#xff0c;2.5D视角。角色在设定好的路线上自由移动&#xff0c;不能超出路线。 之前的做法是用空气墙&#xff0c;设定物理碰撞&#xff0c;然后角色移动。 我感觉这种做法性能有点低。手机上体验平均帧时是4ms 于是想用空间换时间&#xff0c;将可能的运算进行预…

chrome 如何下载网站在线预览PDF文件,保存到本地

爱学习的小伙伴肯定遇到过那种只能在线看&#xff0c;但并不提供下载的的PDF文件&#xff01; 但有时候想保存到本地有很费劲。今天准备了一个很简单的方法 以这个在线pdf为例 在线PDF文件 该如何把这个PDF保存到本地呢~ 方法 1.以chrome浏览器为例&#xff0c;打开准备好的示…

iOS运行时Runtime在OC中的应用场景

本篇将会总结Rutime的具体应用实例&#xff0c;结合其动态特性&#xff0c;Runtime在开发中的应用大致分为以下几个方面&#xff1a; 一、动态方法交换&#xff1a;Method Swizzling 实现动态方法交换(Method Swizzling )是Runtime中最具盛名的应用场景&#xff0c;其原理是&a…

SpringBoot2.0中MVC和WebFlux控制层Controller对比

本篇文章是SpringBoot2.0关于Controller控制层的对比&#xff0c;相信很多开发最好奇的也是这块。那么小编就带着大家一起先来看一下尝尝鲜,本篇文章比较短小精悍,只讲如何使用,至于原理剖析,后面会讲。阅读时间大概3分钟,现在开始! 文章目录一、演示目录结构二、演示启动类定义…

昨天阅读量900多

今日阅读量还不错的样子&#xff0c;也有900多了&#xff0c;

【C语言】函数递归详解

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f4e3;系列专栏&#xff1a;鹏哥带我学c带我飞 &#x1f4ac;总结&#xff1a;希望你看…

解析davinci快捷键配置文件

davinci resolve 是一款非线性影片剪辑软件&#xff0c;mac 下快捷键配置文件位于&#xff1a; lucaslucasdeMacBook-Pro DaVinci Resolve % pwd /Users/lucas/Library/Preferences/Blackmagic Design/DaVinci Resolve lucaslucasdeMacBook-Pro DaVinci Resolve % ll | grep k…

“滴灌”代替“漫灌”:“全链路增长”的百度联盟解

作者 | 曾响铃 文 | 响铃说 2021年时&#xff0c;在平台上的日均收益才不足1000元&#xff0c;日活不足1万&#xff1b; 一年时间不到&#xff0c;现在矩阵产品在平台的日均收入已经翻了90倍&#xff0c;日活翻了25倍。 这是一家白牌资讯媒体“早闻天下事”加入百度联盟后发…

跬智信息(Kyligence)荣获浦东新区人工智能创新应用大赛一等奖

近日&#xff0c;2022 浦东新区人工智能创新应用大赛圆满闭幕。经过层层筛选和考核&#xff0c;跬智信息&#xff08;Kyligence&#xff09;从 113 支团队中脱颖而出&#xff0c;参赛项目“Byzer 面向 DataAI 的低代码开源编程语言”在技术创新性、创意性以及项目的可落地性、可…

spi访问fpga

SPI 外设的三线/四线模式及时钟极性相位可以配置&#xff0c;支持主机/从机、全双工/半双工&#xff0c;传送数据格式可灵活配置&#xff0c;并且有发送空接收满 SPI 错误等中断事件功能配合应用使用&#xff0c;更多功能详见本系列芯片手册的相关章节。 SPI四线模式框图&…

轻松玩转树莓派Pico之五、FreeRTOS体验

树莓派Pico开发板片上主芯片为RP2040单片机&#xff0c;双核 Arm Cortex-M0 处理器&#xff0c;工作主频为133MHz&#xff0c;264K片上SRAM&#xff0c;和2MByteFlash。 这么大的RAM和Flash资源&#xff0c;不跑一下RTOS操作系统实在有些可惜&#xff0c;这次就先体验一下Fre…