客户案例|MemFire Cloud助推应急管理业务,打造百万级数据可视化大屏
「导语」
硬石科技,成立于2018年,总部位于武汉,是一家专注于应急管理行业和物联感知预警算法模型的技术核心的物联网产品和解决方案提供商。硬石科技作为一家高新技术企业,持有6项发明专利,拥有100余项各类平台认证和资质,荣获国家级及省市级荣誉共计13项,受到应急主管部门的高度认可。多年来,硬石科技致力于为应急管理业务提供优质服务,并取得了显著成就。
硬石科技专业致力于应急管理行业,提供以物联网技术和感知预警算法模型为核心的先进产品和解决方案。应急管理行业的业务非常繁多和复杂,很多时候都需要在短时间内交付出稳定高效的业务系统。譬如下图某市的应急综合指挥大屏,这款大屏集成了先进的物联网技术和感知预警算法模型,为应急管理部门提供了强大的工具和支持。通过实时监测和分析数据,应急隐患排查大屏能够帮助应急主管部门在事前、事中和事后快速响应和处理突发事件。
通过之前对MemFire Cloud基本了解,它的一些特性比如自动生成API接口、云存储等功能正是本次需求所需要的。综合考量下,我们决定使用MemFire Cloud来开发此次的应急大屏。
那么,这样一套大屏具体是如何使用MemFire Cloud开发的呢?在开发过程中又会遇到哪些挑战呢?
应急综合指挥大屏带来的三大挑战
1.大量不同维度的隐患数据需要进行统计分析,需要开发各种api接口
隐患数据来源于不同维度的数据采集,包括各个行业领域的数据(几十个领域)、乡镇层面的社区数据,以及不同级别和来源的隐患数据等。为了满足前端的多样化数据展示需求,需要开发大量的API接口来提供各个维度的数据。
2.多样性展示需求、数据关联性复杂,实现各种统计分析
由于隐患数据的多样性和与之相关联的多个数据表,表与表之间存在较强的数据关联性。因此,特定场景下需要进行复杂的统计分析才能获得所需的数据。
3.存储并检索海量的非结构化的隐患数据
隐患大屏需要存储海量的隐患数据的素材,包括图片、视频和附件。这种情况下,需要具备强大的存储和管理大数据的能力,以确保能够有效地存储和检索这些数据的素材。
面对挑战,MemFire Cloud如何破局
那么面对应急综合指挥大屏带来的三大挑战,MemFire Cloud如何一一攻克?
首先,针对大量不同维度的数据需要开发各种API接口的挑战。在项目过程中,根据业务需求我们需要根据时间周期、隐患等级、处置状态、行业领域和行政区划等多个不同的维度来统计和分析,整个过程中需要开发接近30个api接口。采用MemFire Cloud自动生成REST接口,大约一天的工作量就可以获得所有的接口。中途遇到两次需求变更的情况,我们也无需重新编写接口和前后端联调,只需要根据自动生成的API接口返回数据进行一些数据结构的调整即可。这样的优化方案极大地简化了开发流程,提高了开发效率,并确保了应对需求变更的灵活性。
接着,面对多样性展示需求、数据关联性复杂,实现各种统计分析的挑战。在我们开发过程中遇到一些困难,例如在数据表之间没有建立外键关联的情况下如何进行多表关联查询。比如像这样的需求场景:
现在需要查询当前区县下的所有乡镇的数据,乡镇的顺序必须根据表yj_countryside_info
里countryside_type = '1'
后的乡镇的顺序。但是乡镇的数据又在表sys_dept
里,为何不直接使用yj_countryside_info
表呢?这是因为yj_countryside_info
表里是一个数据字典,里面有很多测试乡镇,它并不能代表当前区县的所有乡镇。在这种情况下,我们遇到的问题就是:
「当需要查询一个数据表的数据时,这个数据表的过滤是依赖于另外一张表的某些数据或某个字段时,但是这两张表又未建立关联关系,传统的sql脚本是可以通过左关联查询到的,但是在使用MemFire Cloud目前api是无法做到的。」
我们请教了MemFire Cloud相关的技术人员,他们耐心的解答并给出了三种解决方案。
a. 创建视图
「优点」:视图可以根据特定的业务需求和查询条件,对数据进行过滤、排序、聚合等操作,从而简化了对数据的操作。使用视图可以将复杂的查询逻辑封装到一个视图中,使得用户可以通过简单的查询语句获取所需的数据。
「缺点」:它们可能会影响性能,因为它们需要消耗额外的资源;它们可能不能够提供最新的数据。
b.使用数据库函数
原理就是写一个可以统计数据并且返回统计数据的sql脚本的方法跑在数据库,然后通过MemFire Cloud的rpc数据库方法在前端调用该函数。
例如:
get_sub_dept
就是我们定义的数据库函数
CREATE OR REPLACE FUNCTION get_sub_dept(my_dept_id varchar)
RETURNS TABLE (sub_dept_id VARCHAR)
AS $$
BEGINRETURN QUERY select dept_id from sys_dept d where my_dept_id = any (string_to_array(d.ancestors, ','));
END;
$$ LANGUAGE plpgsql;
在前端调用此方法
const { data, error } = await supabase.rpc('get_sub_dept', { my_dept_id: '1111' })
「缺点」:对前端人员对数据库知识和设计有一定的要求,存在数据库里面的代码,不好维护。
c.子查询
熟悉业务和熟悉数据表的设计的同时和条件允许下,看是否可以通过子查询方式过滤数据。
例如sql脚本:
SELECTsd.dept_id,sd.dept_name
FROMsys_dept sd
WHEREsd.del_flag = '0' AND sd.dept_id IN ( SELECT yci.dept_id FROM yj_countryside_info yci WHERE yci.countryside_type = '1' )
ORDER BYsd.order_num
转换为api查询:
const xz_list = await supabase.from('yj_countryside_info').select('dept_id').eq('countryside_type', '1')
if (xz_list && xz_list.data.length > 0) {const xz_array = xz_list.data.map(item => item.dept_id);const { data, error } = await supabase.from('sys_dept').select('dept_id,dept_name').eq('del_flag', '0').order("order_num", { ascending: true }).in('dept_id', xz_array)
}
经过综合考虑,我们选择了方案C来解决这个问题。我们发现方案C相对于方案A和方案B,在后期的维护成本方面有很大的降低。
最后,面对存储海量隐患相关的图片、视频和附件的挑战。我们借助MemFire Cloud云存储具备强大的存储和管理大数据的能力,创建了存储桶来统一存储海量素材,并使用REST接口及SDK快速实现了文件上传、下载和访问等功能的开发,满足了项目的需求。
总结
通过借助MemFire Cloud的强大能力,项目开发周期由原来的一个月缩短到现在的两周,投入人力由原来的两个减少为一个。这使得开发变得更加高效和简化,抗住了三大数据的挑战,完全不用担心底层数据的问题,保证了数据大屏快速稳定的上线,缩减了时间与人力成本。
使用MemFire Cloud,我们可以专注于前端开发工作,而无需担心后端的搭建和维护,也不需要开发接口,前端只需要关注页面的样式和功能交互。这种快速开发和节约成本的方法,能够更好地实现应急大屏的开发需求。
当然,在使用MemFire Cloud的时候也遇到了一些在使用文档上的不便,比如花费了很长时间才找到自己想要的文档内容。也希望平台能够对此关注起来哈!总体来说,我们对使用MemFire Cloud的开发海量数据大屏的体验还是感到非常惊喜的!也希望MemFire Cloud能够越来越强大!
相关文章:

客户案例|MemFire Cloud助推应急管理业务,打造百万级数据可视化大屏
「导语」 硬石科技,成立于2018年,总部位于武汉,是一家专注于应急管理行业和物联感知预警算法模型的技术核心的物联网产品和解决方案提供商。硬石科技作为一家高新技术企业,持有6项发明专利,拥有100余项各类平台认证和资…...

蒲公英路由器如何设置远程打印?
现如今,打印机已经是企业日常办公中必不可少的设备,无论何时何地,总有需要用到打印的地方,包括资料文件、统计报表等等。 但若人在外地或分公司,有文件急需通过总部的打印机进行打印时,由于不在同一物理网络…...

国产自主可控C++工业软件可视化图形架构源码
关于国产自主代替的问题是当前热点,尤其是工业软件领域。 “一个功能强大的全自主C跨平台图形可视化架构对开发自主可控工业基础软件至关重要!” 作为全球领先的C工业基础图形可视化软件提供商,UCanCode软件有自己的思考,我们认…...

【linux命令讲解大全】022.网络管理工具和命令概述
文章目录 lsattr命令语法选项参数实例 nmcli补充说明语法选项OPTIONSOBJECT 实例 systemctl补充说明任务 旧指令 新指令 实例 开启防火墙22端口 从零学 python lsattr命令 用于查看文件的第二扩展文件系统属性。 语法 lsattr(选项)(参数) 选项 -E:可显示设备属…...

应急响应流程及思路
应急响应流程及思路 一:前言 对于还没有在项目中真正接触、参与过应急响应的同学来说,“应急响应”这四个字见的最多的就是建筑工地上的横幅 —— 人人懂应急,人人会响应。这里的应急响应和我们网络安全中的应急响应有着某种本质的相似&…...

网页自适应
自适应 那就要最好提前商量好 是全局自适应 或者是 局部自适应 一般网站页面纵向滚动条都是无法避免的 都是做横向适配也就是宽度 那就不能写死宽度像素 局部自适应 一般对父元素设置百分比就行 里面的子元素就设置固定像素、 比如一些登录 全局自适应 也就是要对每个元素…...

什么是Sui Kiosk,它可以做什么,如何赋能创作者?
创作者和IP持有者需要一些工具帮助他们在区块链上实现其商业模式。Sui Kiosk作为Sui上的一种原语可以满足这种需求,为创作者提供动态选项,使他们能够在任何交易场景中设置完成交易的条件。 本文将向您介绍为什么要在SuiFrens中使用Sui Kiosk,…...

【MySQL】mysql connect
目录 一、准备工作 1、创建mysql用户 2、删除用户 3、修改用户密码 3.1、自己改自己密码 3.2、root用户修改指定用户的密码 4、数据库的权限 4.1、给用户授权 4.2、回收权限 二、连接mysql client 1、安装mysql客户端库 2、验证是否引入成功 三、 mysql接口 1、初…...

基于 vue2 发布 npm包
背景:组件化开发需要,走了一遍发布npm包的过程,采用很简单的模式实现包的发布流程,记录如下。 项目参考:基于vue的时间播放器组件,并发布到npm_timeplay.js_xmy_wh的博客-CSDN博客 1、项目初始化 首先&a…...

基于Axios完成前后端分离项目数据交互
一、安装Axios npm i axios -S 封装一个请求工具:request.js import axios from axios// 创建可一个新的axios对象 const request axios.create({baseURL: http://localhost:9090, // 后端的接口地址 ip:porttimeout: 30000 })// request 拦截器 // 可以自请求…...

时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比
时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比效果一览基本描述程序设计参考资料 效果一览 基本描述 MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比。 1.Matlab实现PSO-BiLSTM和BiLSTM…...

C# 生成唯一ID
1.首先通过nuget安装yitter.idgenerator 下面的三行代码搞定...

python怎么提取视频中的音频
目录 操作步骤 1. 安装MoviePy库: 2. 导入MoviePy库和所需的模块: 3. 提取音频: 可能遇到的问题 1. 编解码器支持: 2. 依赖项安装: 3. 文件路径问题: 4. 内存消耗: 5. 输出文件大小&a…...

学习设计模式之建造者模式,但是宝可梦
前言 作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。 建造者模式 建造者模式是一种创建型模式,主要针对于某一个类有特别繁杂的属性,并且这些属性中有部分不是必须的。…...

数学建模:变异系数法
🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 变异系数法 变异系数法的设计原理是: 若某项指标的数值差异较大,能明确区分开各被评价对象,说明该指标的分辨信息丰富,因而应给该指标以较大的权重…...

paddle.load与pandas.read_pickle的速度对比(分别在有gpu 何无gpu 对比)
有GPU 平台 测试通用代码 import time import paddle import pandas as pd# 测试paddle.load start_time time.time() paddle_data paddle.load(long_attention_model) end_time time.time() print(f"Paddle load time: {end_time - start_time} seconds")# 测试…...

探讨uniapp的路由与页面栈及参数传递问题
1首先引入页面栈 框架以栈的形式管理当前所有页面, 当发生路由切换的时候,页面栈的表现如下: 页面的路由操作无非:初始化、打开新页面、页面重定向、页面返回、tab切换、重加载。 2页面路由 uni-app 有两种页面路由跳转方式&am…...

字节一面:你能讲一下跨域吗
前言 最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,作为一名前端开发工程师,我们日常开发中与后端联调时一定会遇到跨域的问题,只有处理好了跨域才能够与后端交互完成需求,所以深入学习跨域…...

leetcode 563.二叉树的坡度
⭐️ 题目描述 🌟 leetcode链接:https://leetcode.cn/problems/binary-tree-tilt/description/ 代码: class Solution { public:int childFind(TreeNode* root , int& sumTile) {if (root nullptr) {return 0; // 空树坡度为0}int l…...

【第1章 数据结构概述】
目录 一. 基本概念 1. 数据、数据元素、数据对象 2. 数据结构 二. 数据结构的分类 1. 数据的逻辑结构可分为两大类:a. 线性结构;b. 非线性结构 2. 数据的存储结构取决于四种基本的存储方法:顺序存储、链接存储、索引存储、散列存储 3. …...

【附安装包】MyEclipse2019安装教程
软件下载 软件:MyEclipse版本:2019语言:简体中文大小:1.86G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.5GHz 内存4G(或更高)下载通道①百度网盘丨下载链接:https://pan.baidu.co…...

poi-tl设置图片(通过word模板替换关键字,然后转pdf文件并下载)
选中图片右击 选择设置图片格式 例如word模板 maven依赖 <!-- java 读取word文件里面的加颜色的字体 转pdf 使用 --><dependency><groupId> e-iceblue </groupId><artifactId>spire.doc.free</artifactId><version>3.9.0</ver…...

[element-ui] el-tree 懒加载load
懒加载:点击节点时才进行该层数据的获取。 注意:使用了懒加载之后,一般情况下就可以不用绑定:data。 <el-tree :props"props" :load"loadNode" lazy></el-tree>懒加载—由于在点击节点时才进行该层数据的获取…...

【C++】使用 nlohmann 解析 json 文件
引言 nlohman json GitHub - nlohmann/json: JSON for Modern C 是一个为现代C(C11)设计的JSON解析库,主要特点是 易于集成,仅需一个头文件,无需安装依赖 易于使用,可以和STL无缝对接,使用体验…...

Nginx到底是什么,他能干什么?
目录 Ngnix是什么,它是用来做什么的呢? 一。Nginx简介 二,为什么要用Nginx呢? 二。Nginx应用 1.HTTP代理和反向代理 2.负载均衡 Ngnix是什么,它是用来做什么的呢? 一。Nginx简介 Nginx是enginex的简写&…...

如何判断一个java对象还活着
引用计数算法 引用计数器的算法是这样的:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 缺点&#x…...

Go语言基础之结构体
Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。 类型别名和自定义类型 自定义类型 在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据…...

前端食堂技术周刊第 96 期:2023 CSS 状态、Nuxt 3.7、TypeScript 5.2、eBay 性能优化、贝塞尔曲线
美味值:🌟🌟🌟🌟🌟 口味:冰镇黑乌龙 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来看…...

一文总结Redis知识点
目录 为什么基于MySQL又出现Redis?Redis的优点?Redis支持的基本命令Redis支持的数据结构1 String2 List3 Set4 Sorted Set5 Hash6 Stream 消息队列7 Geospatial 地理空间8 Bitmap 位图9 Bitfield 位域10 HyperLogLog Redis是单线程还是多线程?…...
ARM寄存器组
CM3 拥有通用寄存器 R0‐R15 以及一些特殊功能寄存器。 R0-R7,通用目的寄存器 R0-R7也被称为低组寄存器,所有指令可以访问它们,它们的字长为32位,复位后的初始值是不可预料的。 R8-R12,通用目的寄存器 R8-R12也被称…...