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

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

项目需求

  • 录入进入房间的相关数据;
  • 从进入时间开始计时,计算滞留房间的时间;
  • 定时刷新数据,超过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));
    }
}



@漏刻有时

相关文章
|
3月前
|
数据可视化 前端开发 JavaScript
可视化图表与源代码显示配置项及页面的动态调整功能分析
本篇文章对可视化图表与源代码显示配置项及页面的动态调整进行了一个详细的功能分析,我将文章内容分为四个部分(分析图表源代码;分析源代码显示功能;分析源代码显示及动态调整;分析代码编辑器及运行效果显示)。对此,我会一一为大家解释代码的结构,功能的组成;且文章出现的所有代码,为了方便小白也能够读懂,我都做了详细的注释
52 0
可视化图表与源代码显示配置项及页面的动态调整功能分析
|
3月前
|
数据可视化 定位技术 API
云解析地图作业问题之通过saveEffect实现组件联动如何解决
云解析地图作业问题之通过saveEffect实现组件联动如何解决
50 14
|
3月前
|
JavaScript 前端开发 定位技术
云解析地图作业问题之在搭建页面中简化数据筛选的过程如何解决
云解析地图作业问题之在搭建页面中简化数据筛选的过程如何解决
31 0
|
3月前
|
安全 BI UED
分享一个在 WinForm 桌面程序中使用进度条展示报表处理进度的例子,提升用户体验
分享一个在 WinForm 桌面程序中使用进度条展示报表处理进度的例子,提升用户体验
|
4月前
|
JSON 小程序 数据库
【微信小程序-原生开发】实用教程14 - 列表的分页加载,触底加载更多(含无更多数据的提醒和显示,自定义组件)
【微信小程序-原生开发】实用教程14 - 列表的分页加载,触底加载更多(含无更多数据的提醒和显示,自定义组件)
121 0
|
SQL Java 关系型数据库
从系统报表页面导出20w条数据到本地只用了4秒,我是如何做到的
最近有个学弟找到我,跟我描述了以下场景: 他们公司内部管理系统上有很多报表,报表数据都有分页显示,浏览的时候速度还可以。但是每个报表在导出时间窗口稍微大一点的数据时,就异常缓慢,有时候多人一起导出时还会出现堆溢出。 他知道是因为数据全部加载到jvm内存导致的堆溢出。所以只能对时间窗口做了限制。以避免因导出过数据过大而引起的堆溢出。最终拍脑袋定下个限制为:导出的数据时间窗口不能超过1个月。
|
数据采集 缓存 数据可视化
Echarts高级进阶教程:图表渲染大数据量导致卡顿加载时间慢等问题的解决方案
Echarts高级进阶教程:图表渲染大数据量导致卡顿加载时间慢等问题的解决方案
1847 0
|
数据可视化 前端开发
漏刻有时数据可视化大屏常见问题(13):翻牌器自动刷新数据前后端执行的解决方案
漏刻有时数据可视化大屏常见问题(13):翻牌器自动刷新数据前后端执行的解决方案
125 0
|
缓存 前端开发 数据可视化
漏刻有时数据可视化大屏常见问题(5)修改样式表和图表核心库页面无变化
漏刻有时数据可视化大屏常见问题(5)修改样式表和图表核心库页面无变化
105 0