数据可视化大屏人员停留系统的开发实录(默认加载条件筛选、单击加载、自动刷新加载、异步加载数据)

news2025/4/11 13:04:34

项目需求

  • 录入进入房间的相关数据;
  • 从进入时间开始计时,计算滞留房间的时间;
  • 定时刷新数据,超过30分钟的人数,进行红色告警;

实现流程

为了完整地实现上述需求,我们可以按照以下步骤开发:

  1. 前端页面设计

设计一个合适的前端页面,用于展示所有房间的信息,以及每个房间内的用户信息。自动刷新所有房间内用户信息,以及在用户超时时标记红色的功能。

  1. 编写前端JavaScript逻辑

使用jQuery编写前端JavaScript逻辑,实现定时获取房间内用户信息并判断超时时间,并在用户超时时标记红色的功能。

  1. 后端API设计

设计一组合适的RESTful API,用于获取所有房间信息和房间内用户信息,以及通过ID查询单个用户信息。

  1. 编写后端API逻辑

使用php等技术栈,编写后端API逻辑,实现获取所有房间信息和房间内用户信息,以及查询单个用户信息的功能;并实现定时刷新房间内所有用户的信息,将超时用户的信息存入数据库。

  1. 对接前后端

将前端JavaScript逻辑涉及的API与后端API逻辑进行对接,完成前后端的数据交互。

  1. 测试

根据需求,设计相应的测试用例,对整个应用进行测试,发现并解决潜在问题。

  1. 部署

将应用部署到云服务器等环境中,保证应用能够正常运行,提供稳定的服务。

以上是一个完整的开发流程,当然具体实现细节可能存在一些差异,需要依据具体情况来做相应的调整和修改。
在这里插入图片描述

一、创建HTML容器

<div class="x-body">
    <div class="layui-fluid">
        <form class="layui-form layui-form-pane">
            <div class="layui-card">
                <div class="layui-card-body">
                    <div class="layui-form-item">
                        <label class="layui-form-label">起始时间</label>
                        <div class="layui-input-inline">
                            <input type="text" name="from_time" id="from_time" lay-verify="required" autocomplete="off"
                                   class="layui-input" value=" 2023-06-10 00:00:00">
                        </div>
                        <label class="layui-form-label">截至时间</label>
                        <div class="layui-input-inline">
                            <input type="text" name="to_time" id="to_time" lay-verify="required" autocomplete="off"
                                   class="layui-input" value=" 2023-06-10 23:59:59">
                        </div>
                        <span class="layui-btn" id="searchBtn">筛选</span>
                    </div>
                </div>
            </div>
            <!--数据列表-->
            <div class="layui-card">
                <div class="layui-card-header" style="text-align: center;font-weight: bold;">战时安全大屏</div>
                <div class="layui-card-body">
                    <table class="layui-table">
                        <thead>
                        <tr align="center">
                            <th>序号</th>
                            <th>单位</th>
                            <th>姓名</th>
                            <th>当前状态</th>
                            <th>空呼压力</th>
                            <th>在内人数</th>
                            <th>进入时间</th>
                            <th>滞留时间</th>
                        </tr>
                        </thead>
                        <tbody id="detail"></tbody>
                    </table>
                </div>
            </div>
        </form>
    </div>
</div>

二、默认加载条件筛选数据

  /*默认加载数据*/
    window.onload = function getDefaultDate() {
        var from_time = $("#from_time").val();
        var to_time = $("#to_time").val();
        getDetails(from_time, to_time);
    }

也可以使用jQuery的ready()方法,当页面加载完成后,我们使用val()方法获取了input元素的值,然后使用ajax()方法以POST方式发送数据到指定的API URL。在这个例子中,我们将input元素的值封装在data对象中,并使用属性名称"inputValue"作为键。成功发送数据后,我们可以在success回调函数中处理返回的数据。

$(document).ready(function(){
  // 获取input元素的值
  var inputValue = $("#input-field").val();

  // 使用ajax发送数据
  $.ajax({
    url: "your-api-url",
    type: "post",
    data: {inputValue: inputValue},
    success: function(data){
      console.log(data); // 处理返回数据
    }
  });
});

三、单击搜索条件筛选

   //单击加载数据;
    $("#searchBtn").click(function () {
        var from_time = $("#from_time").val();
        var to_time = $("#to_time").val();
        getDetails(from_time, to_time);
    });

四、自动刷新加载数据

    //自动刷新数据;
    var interVal;
    var from_time = $("#from_time").val();
    var to_time = $("#to_time").val();
    getDetails(from_time, to_time);
    clearInterval(interVal);
    interVal = setInterval(function () {
        var from_time = $("#from_time").val();
        var to_time = $("#to_time").val();
        getDetails(from_time, to_time);
    }, 6 * 1000);

五、异步加载刷新

  //加载数据
    function getDetails(from_time, to_time) {
        $.ajax({
            type: "get",
            async: true,
            url: "./api/api.php?act=getFireInroom&token=3cab7ce4142608c0f40c785b5ab5ca24",
            data: {
                from_time: from_time,
                to_time: to_time
            },
            dataType: "json",
            success: function (res) {
                //console.log(res.data);
                var detailHtml = '';
                if (res.data) {
                    for (var i = 0; i < res.data.length; i++) {
                        detailHtml += ' <tr>' +
                            '<th>' + (i + 1) + '</th>' +
                            '<td>' + res.data[i]['fire_depart'] + '</td>' +
                            '<td>' + res.data[i]['fire_name'] + '</td>' +
                            '<td>' + res.data[i]['fire_status'] + '</td>' +
                            '<td>' + res.data[i]['fire_pressure'] + '</td>' +
                            '<td>' + res.data[i]['fire_nums'] + '</td>' +
                            '<td>' + res.data[i]['fire_time_show'] + '</td>' +
                            '<td>' + getDiff(res.data[i]['fire_time'], res.data[i]['cur_time']) + '</td>' +
                            '</tr>'
                    }
                }
                $("#detail").html(detailHtml);
            },
            error: function (err) {
                console.log("获取队员详情API:" + err);
            }
        });
    }

六、时间戳计算

   //计算时间戳
    function getDiff(timestamp1, timestamp2) {
        var date1 = timestamp1 + '000'; // 转换为本地时间
        var date2 = timestamp2 + '000'; // 转换为本地时间
        var milliseconds = Math.abs(date1 - date2); // 获取两个时间之间的毫秒数
        var minutes = milliseconds / (1000 * 60); // 将毫秒数转换为分钟数
        if (minutes > 30) {
            return "<label class='x-red'>" + Math.floor(minutes) + " 分钟</label>";
        } else {
            return Math.floor(minutes) + " 分钟"; // 向下取整
        }
    }

如果计算的两个时间戳之间的分钟数显示Invalid Date,那么可能是因为输入的时间戳不是有效的日期格式。在JavaScript中,时间戳是一个数字,表示自1970年1月1日UTC的毫秒数。如果你在计算时使用了一个非法的时间戳,JavaScript将无法将其转换为一个有效的日期对象,从而显示Invalid Date

检查是否输入的时间戳是有效的,可以尝试输出时间戳并检查它是否满足你的期望格式。例如,时间戳应该是一个整数,而不是一个浮点数。另外,可能还有一个原因是,=时间戳表示的是服务器的时间戳,而不是本地时间戳。在这种情况下,你需要将服务器时间转换为本地时间,或使用另一种方法计算时间间隔,例如,使用Date对象而不是时间戳来计算时间间隔。

七、日历插件

    layui.use(['form', 'layer', 'laydate'], function () {
        var $ = layui.jquery;
        var form = layui.form, laydate = layui.laydate;

        //时间选择器
        laydate.render({
            elem: '#to_time'
            , theme: '#40a9ff'
            , type: 'datetime'
        });

        laydate.render({
            elem: '#from_time'
            , theme: '#40a9ff'
            , type: 'datetime'
        });
    });

八、后端API

 public function getFireInroom()
    {
        global $db, $res;
        dbc();
        @$from_time = strtotime(get_param('from_time'));
        @$to_time = strtotime(get_param('to_time'));
        $sql = "select fire_id,fire_depart,fire_name,fire_status,fire_nums,fire_pressure,from_unixtime(fire_time) AS fire_time_show,fire_time,unix_timestamp() AS cur_time  from " . $db->table('fireground') . " where fire_status = '入'";
        if ($from_time != "") {
            $sql .= ' AND fire_time > ' . $from_time;
        }
        if ($to_time != "") {
            $sql .= ' AND fire_time < ' . $to_time;
        }
        $sql .= ' ORDER BY fire_id DESC';
        $row = $db->queryall($sql);
        $res["data"] = $row;
        die(json_encode_lockdata($res));
    }
}

@漏刻有时

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

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

相关文章

Log4j2漏洞复现补丁绕过

漏洞复现 这里我一共使用了两个jdk版本 8u202的情况比较特殊&#xff0c;其实我今天凌晨在家里用的也是8u202的版本&#xff0c;失败了。今天来公司也是用的8u202版本的jdk&#xff0c;成功了。我仔细研究了两者的不同&#xff0c;我发现唯一不同的就是我公司这个idea启的proie…

NLP——分布式语义 Distributional Semantics:Word Vectors;Word2Vec

文章目录 传统语义数据集的缺点分布式语义Word Vectors 词向量Count-based 基于统计的方法Document 作为上下文 —— 向量空间模型&#xff08;VSM&#xff09;TF-IDF 更加有效的编码方式降维Singular Value Decomposition neighbor words 作为上下文 基于深度学习的方法Word2V…

highlight clock tree 高亮时钟树的方法

当分析clock tree需要在图形界面highlight clock tree时&#xff0c;最朴实无华的方法就是贴报告&#xff0c;除此之外这里也分享一下用命令的方法。 1.Imported Path Pins 1&#xff09;Highlight > Color By > Imported Path Pins 2&#xff09;report_timing icc2…

【MySQL 数据库】9、存储过程

目录 一、存储过程是什么二、存储过程的基本语法三、MySQL 中的变量(1) 系统变量(2) 用户自定义变量(3) 局部变量 四、if 判断五、参数传递和返回值六、case 语句七、while 循环八、repeat 循环九、loop 循环十、游标十一、条件处理程序 一、存储过程是什么 &#x1f331; 存储…

Linux进程间通信【消息队列、信号量】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、消息队列1.1、什么是消息队列&#xff1f;1.2、消息队列的数据结构1.3、消…

交通物流模型 | Python实现基于张量分解的交通流量时空模式挖掘(出租车车载GPS数据、公交卡刷卡数据、POI的分布数据)

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 一般出行行程通常都由某种明确目的驱使,例如上班、购物或娱乐,出行的起始区域因其承担功能的不同,通常能够反映出用户的出行目的,于此同时,从宏观来看,区域之间的交通流量在一天内的变化规律也能够反…

【数据结构与算法】03 队列(顺序队列--循环队列--优先级队列--链队列)

一、概念1.1 队列的基本概念1.2 队列的顺序存储结构1.21 顺序队列&#xff08;静态队列&#xff09;1.22 循环队列1.23 优先级队列 1.3 队列的链式存储结构 二、C语言实现2.1 顺序存储2.11 顺序队列2.12 循环队列2.13 优先级队列 2.2 链式存储 一、概念 1.1 队列的基本概念 队…

【python】—— python的基本介绍并附安装教程

前言&#xff1a; 今天&#xff0c;我将给大家讲解关于python的基本知识&#xff0c;让大家对其有个基本的认识并且附上相应的安装教程以供大家参考。接下来&#xff0c;我们正式进入今天的文章&#xff01;&#xff01;&#xff01; 目录 前言 &#xff08;一&#xff09;P…

【Linux】互斥量原理的实现

深刻理解互斥锁 文章目录 前言一、demo版的线程封装二、demo版的锁封装总结 前言 为了实现互斥锁操作 , 大多数体系结构都提供了 swap 或 exchange 指令 , 该指令的作用是把寄存器和内存单元的数据相交换, 由于只有一条指令 , 保证了原子性 , 即使是多处理器平台 , 访问内存的总…

第10讲:深入剖析 Agent 插件原理,无侵入性埋点

AbstractClassEnhancePluginDefine 核心实现 在开始之前&#xff0c;先简单回顾上一课时中关于 AbstractClassEnhancePluginDefine 的一个核心知识点&#xff1a;AbstractClassEnhancePluginDefine 是所有插件的父类&#xff0c;SkywalkingAgent.Transformer 会通过其 enhance…

信号完整性:反射

反射是怎么形成的 信号的反射和互连线的阻抗密切相关。反射的最直接原因是互连线的阻抗发生了突然变化&#xff0c;只要互连线的阻抗不连续的点&#xff0c;该处就会发生反射。 信号是以电磁波的形式在走线中传播的&#xff0c;如果从传统的电路理论角度去看&#xff0c;是无…

YOLOv5使用自定义数据集实验

上一篇博文中介绍了YOLOv7训练自定义数据集&#xff0c;在这篇文章中&#xff0c;我们主要记录YOLOv5模型的实验过程&#xff0c;用于对比实验。 YOLOv5与YOLOv7毕竟一母同胞&#xff0c;因此部署起来也是极为类似。 数据集 数据集使用的与YOLOv7的实验数据集一样&#xff0c;…

windows服务器自带IIS搭建网站并发布公网访问

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 转载自远程源码文章&#xff1a;【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网…

VS2019生成和使用lib、dll文件

叠甲&#xff1a;本文非常简略&#xff0c;方法非常朴素&#xff0c;仅供参考。 目录 lib文件 生成lib文件 使用lib文件 dll文件 生成dll文件 使用dll文件 lib文件 生成lib文件 新建项目libTest。 右键项目→属性→配置属性→常规→配置类型&#xff0c;选择“静态库…

【Java】表白墙终章-飞流直下的“甜言蜜语”-瀑布流式布局

飞流直下三千尺&#xff01; 文章目录 【Java】表白墙终章-飞流直下的“甜言蜜语”-瀑布流式布局1. 效果前后对比2. 瀑布流式布局原理思想3. 约定前后端接口4. 后端代码4.1 修改Love类的定义4.2 修改doPost方法4.3 修改save方法4.4 修改doGet方法4.5 修改load方法 5. 前端瀑布流…

面试总结个人版

一、面试题 java 集合 &#xff0c; spring springmvc springboot springcloud 数据库相关的&#xff0c; redis 相关 &#xff0c;mq 相关 &#xff0c;结合业务的场景题 1、part one 集合 HashMap底层原理 HashMap是基于哈希表的Map接口的非同步实现。元素以键值对的形式存…

asp.net教师调课系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net教师调课管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net教师调课系统VS开发sqlser…

deadline用WebService提交Job

官方文档 网站链接 进入rest API&#xff0c;点击jobs&#xff0c;找到submit job 这里可以看到消息体需要用到JobInfo和PluginInfo这两个关键的字典&#xff08;json object&#xff09; 拿到对应的键值对 为了填写url请求的消息体 我们需要拿到必须参数的键值对 点击双击…

如何延长电脑硬盘的使用寿命?

在日常使用电脑过程中&#xff0c;一定要做好硬盘的保养和维护&#xff0c;一旦硬盘损坏&#xff0c;保存在硬盘上的数据就会丢失&#xff0c;而且找回数据也是一件很费功夫的事情&#xff0c;甚至有可能永远也找不回来。所以日常工作中定期对资料进行备份&#xff0c;做好电脑…

【算法与数据结构】24、LeetCode两两交换链表中的节点

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;题目要求两两交换节点。在链表当中非常重要就是下一个节点&#xff0c;一旦丢失&#xff0c;这个节点后…