Index.cshtml 9.1 KB
@using HHECS.DAQWebClient.Dtos
@model List<LogModel>
@{
    ViewData["Title"] = "控制台";
}

<div class="layui-card">
    <div class="layui-card-body layui-form" style="margin-left:10px">
        <button id="start" class="layui-btn layui-btn-sm" lay-on="start"><i class="fa fa-play" aria-hidden="true"></i>启动</button>
        <button id="stop" class="layui-btn layui-btn-sm layui-bg-orange layui-btn-disabled" lay-on="stop" style="margin-right:10px;"><i class="fa fa-stop" aria-hidden="true"></i>停止</button>
        <input type="checkbox" name="autoCommit" title="自动上传" lay-skin="tag" lay-filter="autoCommit-checkbox-filter">
        <input type="checkbox" name="dataCompression" title="节流模式" lay-skin="tag" lay-filter="dataCompression-checkbox-filter">
        <span><strong>队列缓存:</strong><span id="queue">0</span></span>
        <span style="margin-left:10px;"><strong>MQTT:</strong><span id="mqtt" class="layui-badge">未连接</span></span>
    </div>
</div>

<div class="layui-card">
    <div class="layui-card-header">日志</div>
    <div class="layui-card-body" id="logPanel">
        @foreach (var item in Model)
        {
            var css = item.Level switch
            {
                LogLevel.Information => "layui-bg-green",
                //LogLevel.Information => "layui-bg-blue",
                LogLevel.Warning => "layui-bg-orange",
                LogLevel.Error or
                LogLevel.Debug => "layui-bg-red",
                _ => "layui-bg-gray"
            };
            <div id="" class="@css" style="padding:0px 5px;margin-top:1px">
                @($"{item.CreateTime}:")<span>@item.Message</span>
            </div>
        }
    </div>
</div>
@section Scripts{
    <script type="text/javascript" asp-append-version="true">
        layui.use(['util', 'form'], function () {
            let $ = layui.$;
            let form = layui.form;
            let util = layui.util;
            // Start the connection.
            var connection = new signalR.HubConnectionBuilder()
                .withUrl('/DAQHub')
                .withAutomaticReconnect()
                .build();

            // Create a function that the hub can call to broadcast messages.
            connection.on('pringtLog', function (log) {
                //console.log(log);
                let logDateTime = new Date(log.createTime).toLocaleString();
                let oldLogDiv = $(`#logPanel div:has(span:contains('${log.message}'))`)[0];
                console.log(oldLogDiv);
                if (oldLogDiv != undefined) {
                    let dom = $(oldLogDiv);
                    let txt = `${logDateTime}:<span>${log.message}</span>`;
                    dom.html(txt);
                    if (!dom.is('#logPane div:first-child')) {
                        dom.insertBefore(dom.parent().find('div:first'));
                    }
                }
                else {
                    let css = '';
                    switch (log.level) {
                        case 2:
                            css = 'layui-bg-green'
                            break;
                        case 3:
                            css = 'layui-bg-orange'
                            break;
                        case 1:
                        case 4:
                            css = 'layui-bg-red'
                            break;
                        default:
                            css = 'layui-bg-gray'
                            break;
                    }
                    let newDiv = `<div class="${css}" style="padding:0px 5px;margin-top:1px">${logDateTime}:<span>${log.message}</span></div >`;
                    // 将新元素添加到父div中
                    $('#logPanel').prepend(newDiv);
                }
                if ($('#logPanel').children().length > 30) {
                    $('#logPanel div:last-child').remove();
                }
            });
            connection.on('statusNotice', function (result) {
                initialStatus(result);
            });

            connection.on('queueNotice', function (count) {
                $('#queue').text(count);
            });

            connection.on('mqttConnectedNotice', function (isConnected) {
                if (isConnected) {
                    $('#mqtt').addClass('layui-bg-green');
                    $('#mqtt').text('已连接');
                } else {
                    $('#mqtt').removeClass('layui-bg-green');
                    $('#mqtt').text('未连接');
                }
            });

            // Transport fallback functionality is now built into start.
            connection.start().then(function () {
                connection.invoke("consoleStatus").then(function (result) {
                    if (result.code != 200) {
                        layer.msg(result.msg, { icon: 2 });
                        return;
                    }
                    initialStatus(result.data);
                }).catch(function (err) {
                    layer.msg(err.toString(), { icon: 2 });
                })
                console.log('connection started');
            }).catch(error => {
                layer.msg(error.message, { icon: 2 });
                console.error(error.message);
            });

            util.on({
                start: function () {
                    let dom = $(this);
                    let disabled = dom.hasClass('layui-btn-disabled');
                    if (disabled) {
                        return;
                    }
                    connection.invoke("start")
                        .then(function (result) {
                            if (result.code != 200) {
                                layer.msg(result.msg, { icon: 2 });
                                return;
                            }
                            startBtnChanged(true);
                        }).catch(function (err) {
                            layer.msg(err.toString(), { icon: 2 });
                        });
                },
                stop: function () {
                    let dom = $(this);
                    let disabled = dom.hasClass('layui-btn-disabled');
                    if (disabled) {
                        return;
                    }
                    connection.invoke("stop")
                        .then(function (result) {
                            if (result.code != 200) {
                                layer.msg(result.msg, { icon: 2 });
                                return;
                            }
                            startBtnChanged(false);
                        }).catch(function (err) {
                            layer.msg(err.toString(), { icon: 2 });
                        });
                }
            });

            form.on('checkbox(autoCommit-checkbox-filter)', function (data) {
                let elem = data.elem; // 获得 checkbox 原始 DOM 对象
                connection.invoke("autoCommit", elem.checked)
                    .then(function (result) {
                        if (result.code != 200) {
                            $(elem).prop('checked', !elem.checked)
                            layer.msg(result.msg, { icon: 2 });
                            return;
                        }
                    }).catch(function (err) {
                        $(elem).prop('checked', !elem.checked)
                        layer.msg(err.toString(), { icon: 2 });
                    });
            });

            form.on('checkbox(dataCompression-checkbox-filter)', function (data) {
                let elem = data.elem; // 获得 checkbox 原始 DOM 对象
                connection.invoke("dataCompression", elem.checked)
                    .then(function (result) {
                        if (result.code != 200) {
                            $(elem).prop('checked', !elem.checked)
                            layer.msg(result.msg, { icon: 2 });
                            return;
                        }
                    }).catch(function (err) {
                        $(elem).prop('checked', !elem.checked)
                        layer.msg(err.toString(), { icon: 2 });
                    });
            });

            function initialStatus(data) {
                startBtnChanged(data.isStart);
                autoCommitChanged(data.autoCommit);
                dataCompressionChanged(data.dataCompression);
            }

            //启动按钮
            function startBtnChanged(isStart) {
                if (isStart) {
                    $('#start').addClass('layui-btn-disabled');
                    $('#stop').removeClass('layui-btn-disabled');
                } else {
                    $('#start').removeClass('layui-btn-disabled');
                    $('#stop').addClass('layui-btn-disabled');
                }
            }

            //自动上传
            function autoCommitChanged(status) {
                $('[lay-filter="autoCommit-checkbox-filter"]')[0].checked = status;
            }

            //节流模式
            function dataCompressionChanged(status) {
                $('[lay-filter="dataCompression-checkbox-filter"]')[0].checked = status;
            }
        })
    </script>
}