当前位置: 首页 > news >正文

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

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

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

二. 主要技术栈

  • 数据可视化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博客

 

相关文章:

  • RK3568平台开发系列讲解(系统优化篇)系统卡顿了怎么办
  • 防火墙豁免实验
  • [激光原理与应用-45]:《焊接质量检测》-2- 常见焊接缺陷与检验方法
  • 用HTML+CSS做一个漂亮简单大学生校园班级网页
  • Day42——Dp专题
  • 高通平台开发系列讲解(UART篇)高速串口代码流程
  • STC 51单片机61——呼吸灯
  • 还有13天圣诞节,用python整个简易版的圣诞树玩一下.......
  • 西湖大学张岳老师NLP课程笔记1 Introduction
  • Vue 使用socket.io实现聊天室
  • 笔试题之编写SQL按要求查询用户阅读行为数据
  • 用python给女朋友写个圣诞树玩玩~
  • JAVA毕业设计汇美食电子商城计算机源码+lw文档+系统+调试部署+数据库
  • Qt之天气预报——功能实现篇(含源码+注释)
  • STL常用生成算法和集合算法(20221207)
  • 基于遗传算法解决TSP问题(Matlab代码实现)
  • Python操作Excel表格
  • 2022年Python面试题汇总【面试官爱问】
  • 【Linux学习】进程概念(下)
  • 认知电子战 | 认知电子战简介
  • 解放日报:中国大模型企业的发展机遇已经到来
  • “ChatGPT严选”横空出世了,“DeepSeek严选”还要等多久?
  • 华夏银行一季度营收降逾17%、净利降逾14%,公允价值变动损失逾24亿
  • 葡萄牙总理:未来几小时内将全面恢复供电
  • 西班牙遭遇史上最严重停电,已进入国家紧急状态
  • 国家发改委答澎湃:力争6月底前下达2025年两重建设和中央预算内投资全部项目清单