rootfs_enc1v2_hi3520d_20240131

This commit is contained in:
Jan Koppe 2024-02-15 22:07:54 +01:00
parent 9f42b6e939
commit 573117aac4
Signed by: thunfisch
GPG Key ID: BE935B0735A2129B
72 changed files with 1292 additions and 564 deletions

Binary file not shown.

View File

@ -1,6 +1,6 @@
rtmp {
server {
listen 1935;
listen 1935 so_keepalive=2s:3:1;
chunk_size 10240;
wait_video on;
application live{

View File

@ -1,4 +1,17 @@
[
{
"version": "3.0.0 build 20240131",
"logs": [
"标准版:修正部分页面翻译问题",
"标准版修正NDI注册不成功问题",
"标准版:新增标题关键字检索功能",
"布局管理器新增布局中视频通道绑定音源",
"修复NTFS格式硬盘不能自动挂载问题",
"优化部分HTTP接口逻辑",
"优化文件录制功能",
"ENC1V3、ENCSHV2、ENC4S机型内核优化UDP稳定性"
]
},
{
"version": "2.9.0 build 20231229",
"logs": [

View File

@ -1,5 +1,5 @@
{
"app": "2.0.0 build 20220512_869",
"sdk": "2.0.0 build 20220518_20716",
"sys": "2.9.0 build 20231229"
"sys": "3.0.0 build 20240131"
}

View File

@ -16,3 +16,7 @@ fi
if [ -f /link/bin/Monitor ];then
/link/shell/monitor.sh &
fi
if [ -f /link/bin/TFT ];then
/link/shell/tft.sh &
fi

View File

@ -1,5 +1,6 @@
#!/bin/sh
. /etc/profile
. /link/shell/util/func.sh
jopen /link/config/misc/disk.json
enable=`jget enable`

View File

@ -1,3 +1,3 @@
cp /link/config/default/* /link/config/
rm -rf /link/config/auto/*
cp -r /link/config/default/* /link/config/
reboot

View File

@ -1,5 +1,11 @@
if [ ! -f "/link/config/mac" ] || [ ! -s /link/config/mac ] || [ -z "$(cat /link/config/mac)" ]; then
/link/shell/makeMac.sh > /link/config/mac
ethaddr=`fw_printenv ethaddr | grep ethaddr | awk -F '=' '{print $2}' | sed 's/\://g'`
if echo "$ethaddr" | grep -q "34C8D62" ; then
echo $ethaddr > /link/config/mac
fi
fi
/sbin/ifconfig eth0 down

5
rootfs/link/shell/tft.sh Normal file
View File

@ -0,0 +1,5 @@
while [ true ]
do
/link/bin/TFT
sleep 2
done

View File

@ -46,13 +46,23 @@ class Layout extends Verify
$result['srcA'] = $item['srcA'];
foreach ($defLays as $defLay)
{
$layList = [];
$layList = [];$layList1=[];
$layouts = $defLay['layouts'];
foreach ($layouts as $layout)
{
$pos = $layout['pos'];
//按顺序生成新对象,方便后面对比
$lay = array(
'a' => $pos['a'],
'x' => $pos['x'],
'y' => $pos ['y'],
'w' => $pos['w'],
'h' => $pos['h'],
'index' => $pos['index']
);
array_push($layList,$lay);
$lay1 = array(
'a' => $pos['a'],
'h' => $pos['h'],
'index' => $pos['index'],
@ -60,9 +70,9 @@ class Layout extends Verify
'x' => $pos['x'],
'y' => $pos ['y']
);
array_push($layList,$lay);
array_push($layList1,$lay1);
}
if(json_encode($item['layout']) == json_encode($layList))
if(json_encode($item['layout']) == json_encode($layList) || json_encode($item['layout']) == json_encode($layList1))
{
$result['curLayId'] = $defLay['layId'];
$result['curLayName'] = $defLay['layName'];

View File

@ -51,15 +51,13 @@ class Overlay extends Verify
$conf = $this->load_conf('/link/config/config.json');
$mark = file_exists("/link/config/auto/overlay.json");
var_dump($mark);
if($mark)
{
$overlayConf = $this->load_conf('/link/config/auto/overlay.json');
$overlayConf = [];
for($i=0;$i<count($params);$i++)
{
$param = $params[$i];
$overlayConf[$param['id']] = $param['overlay'];
$overlayConf[] = $param['overlay'];
}
$client = new RpcClient();
$client->update_overlay($overlayConf);
@ -71,6 +69,7 @@ class Overlay extends Verify
$param = $params[$i];
$id = $param['id'];
$chn=null;$index=-1;
for($j=0;$j<count($conf);$j++)
{

View File

@ -55,15 +55,13 @@ function copyUserSettings(&$historyConfig, &$currentConfig,&$level=0) {
$configFiles = getConfFiles('/tmp/history_config');
foreach ($configFiles as $historyFile) {
$currentFile = str_replace("/tmp/history_config/","/link/config/",$historyFile);
if(md5_file($historyFile) == md5_file($currentFile))
if(!strpos($currentFile, ".json") || md5_file($historyFile) == md5_file($currentFile))
continue;
if(!strpos($currentFile, ".json") || strpos($currentFile, "version.json") ||
strpos($currentFile, "net.json") || strpos($currentFile, "net2.json") || strpos($currentFile, "netEx.json"))
$ignoreFiles = ['version.json', 'net.json', 'net2.json', 'netEx.json', 'netManager.json', 'verLogs.json'];
if (in_array(basename($currentFile), $ignoreFiles))
continue;
echo $currentFile."\n";
$historyCtx = json_decode(file_get_contents($historyFile));
$currentCtx = json_decode(file_get_contents($currentFile));

View File

@ -459,9 +459,9 @@ include("head.php");
function init() {
for (var i = 0; i < config.length; i++) {
$("#laySrc").append('<option value="' + config[i].id + '">' + config[i].name + '</option>');
$("#vgasrc").append('<option value="' + config[i].id + '">' + config[i].name + '</option>');
$("#hdmisrc").append('<option value="' + config[i].id + '">' + config[i].name + '</option>');
$("#laySrc").append('<option value="' + config[i].id + '">' + config[i].name + '</option>');
$("#vgasrc").append('<option value="' + config[i].id + '">' + config[i].name + '</option>');
$("#hdmisrc").append('<option value="' + config[i].id + '">' + config[i].name + '</option>');
if (config[i].type != "mix")
continue;
@ -479,40 +479,32 @@ include("head.php");
$("#SysLayout").change(function() {
curLayIndex = $("#SysLayout").val();
var defLay = defLays[curLayIndex];
var temp = [];
var type = false;
var tempV = [];
var tempA = [];
var typeV = false;
var typeA = false;
for (var i = 0; i < defLay.layouts.length; i++) {
var lay = defLay.layouts[i];
if (lay.id < 0) {
temp.push("-1");
tempV.push("-1");
} else {
type = true;
temp.push(lay.id + "");
typeV = true;
tempV.push(lay.id + "");
if(lay.ado) {
tempA.push(lay.id + "");
typeA = true;
}
}
}
var mixSrcV = mixCfg["srcV"];
//如果自定义布局中存在指定输入源
if (type)
mixCfg["srcV"] = temp;
// for(var i=0;i<mixSrcV.length;i++){
// if( i >= temp.length)
// break;
// if(mixSrcV[i] == "-1")
// continue;
// var mark = false;
// for(var j=0;j<temp.length;j++){
// if(temp[j] == mixSrcV[i])
// mark = true;
// }
// if(!mark)
// temp[i] = mixSrcV[i];
// }
// mixCfg["srcV"] = temp;
if (typeV)
mixCfg["srcV"] = tempV;
if (typeA)
mixCfg["srcA"] = tempA;
setLayout();
update();
});
setChannel($('#channels option:first').val());
update();
}
function setLayout() {
@ -521,16 +513,17 @@ include("head.php");
$("#layout").html('');
for (var i = 0; i < layout.length; i++) {
var lay = $("#templeLay").clone();
var optlist = lay.find("#laySrc").find("option").toArray();
for (var k = optlist.length - 1; k >= 0; k--) {
var opt = optlist[k];
var id = $(opt).val() + "";
for (var n = 0; n < mixV.length; n++) {
if (id == mixV[n] && id != mixV[i] && id != "-1") {
lay.find("#laySrc")[0].options.remove(k);
}
}
}
// var optlist = lay.find("#laySrc").find("option").toArray();
// for (var k = optlist.length - 1; k >= 0; k--) {
// var opt = optlist[k];
// var id = $(opt).val() + "";
// for (var n = 0; n < mixV.length; n++) {
// if (id == mixV[n] && id != mixV[i] && id != "-1") {
// console.log(id);
// lay.find("#laySrc")[0].options.remove(k);
// }
// }
// }
lay.css("display", "block");
lay.css("left", (layout[i].x * 100) + "%");
@ -576,18 +569,11 @@ include("head.php");
layList.push(layObj);
}
var str = JSON.stringify(layList);
curLayIndex = 6;
for (var i = 0; i < SysLayout.length; i++) {
if (JSON.stringify(SysLayout[i]) == str) {
$("#SysLayout").val(i);
curLayIndex = i;
}
}
if (curLayIndex == 6) {
$("#SysLayout").val(6);
SysLayout[6] = mixCfg["layout"];
}
setLayout();
}
@ -617,7 +603,7 @@ include("head.php");
lay.find("#laySrc")[0].options.length = 1;
for (var k = 0; k < config.length; k++) {
if ($.inArray(config[k].id + "", mixV) < 0 || config[k].id + "" == mixV[i]) {
lay.find("#laySrc").append('<option value="' + config[k].id + '">' + config[k].name + '</option>');
lay.find("#laySrc").append('<option value="' + config[k].id + '">' + config[k].name + '</option>');
}
}
lay.find("#laySrc").val(mixV[i]);
@ -698,22 +684,6 @@ include("head.php");
init();
});
$.ajaxSettings.async = true;
setInterval(function() {
$.getJSON("config/defLays.json?rnd=" + Math.random(), function(result) {
defLays = result;
SysLayout = [];
for (var i = 0; i < defLays.length; i++) {
var defLay = defLays[i];
var las = defLay.layouts;
var layout = [];
for (var j = 0; j < las.length; j++) {
layout.push(las[j].pos);
}
SysLayout.push(layout);
}
});
}, 1000)
</script>
<?php
include("foot.php");

View File

@ -1,26 +1,26 @@
{
"files": {
"main.css": "./mixer/static/css/main.375af961.chunk.css",
"main.js": "./mixer/static/js/main.5f5e49d2.chunk.js",
"main.js.map": "./mixer/static/js/main.5f5e49d2.chunk.js.map",
"main.css": "./mixer/static/css/main.1be3e506.chunk.css",
"main.js": "./mixer/static/js/main.6a7a8d48.chunk.js",
"main.js.map": "./mixer/static/js/main.6a7a8d48.chunk.js.map",
"runtime-main.js": "./mixer/static/js/runtime-main.c45edf70.js",
"runtime-main.js.map": "./mixer/static/js/runtime-main.c45edf70.js.map",
"static/css/2.0b7c8b97.chunk.css": "./mixer/static/css/2.0b7c8b97.chunk.css",
"static/js/2.f2aad125.chunk.js": "./mixer/static/js/2.f2aad125.chunk.js",
"static/js/2.f2aad125.chunk.js.map": "./mixer/static/js/2.f2aad125.chunk.js.map",
"static/js/2.edf0bfe8.chunk.js": "./mixer/static/js/2.edf0bfe8.chunk.js",
"static/js/2.edf0bfe8.chunk.js.map": "./mixer/static/js/2.edf0bfe8.chunk.js.map",
"index.html": "./mixer/index.html",
"precache-manifest.1a06c0869ff880086e3a9be9dac86c16.js": "./mixer/precache-manifest.1a06c0869ff880086e3a9be9dac86c16.js",
"precache-manifest.abb42691e68409f9e64fbfb6933199f3.js": "./mixer/precache-manifest.abb42691e68409f9e64fbfb6933199f3.js",
"service-worker.js": "./mixer/service-worker.js",
"static/css/2.0b7c8b97.chunk.css.map": "./mixer/static/css/2.0b7c8b97.chunk.css.map",
"static/css/main.375af961.chunk.css.map": "./mixer/static/css/main.375af961.chunk.css.map",
"static/js/2.f2aad125.chunk.js.LICENSE.txt": "./mixer/static/js/2.f2aad125.chunk.js.LICENSE.txt",
"static/js/main.5f5e49d2.chunk.js.LICENSE.txt": "./mixer/static/js/main.5f5e49d2.chunk.js.LICENSE.txt"
"static/css/main.1be3e506.chunk.css.map": "./mixer/static/css/main.1be3e506.chunk.css.map",
"static/js/2.edf0bfe8.chunk.js.LICENSE.txt": "./mixer/static/js/2.edf0bfe8.chunk.js.LICENSE.txt",
"static/js/main.6a7a8d48.chunk.js.LICENSE.txt": "./mixer/static/js/main.6a7a8d48.chunk.js.LICENSE.txt"
},
"entrypoints": [
"static/js/runtime-main.c45edf70.js",
"static/css/2.0b7c8b97.chunk.css",
"static/js/2.f2aad125.chunk.js",
"static/css/main.375af961.chunk.css",
"static/js/main.5f5e49d2.chunk.js"
"static/js/2.edf0bfe8.chunk.js",
"static/css/main.1be3e506.chunk.css",
"static/js/main.6a7a8d48.chunk.js"
]
}

View File

@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./mixer/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="./mixer/logo192.png"/><link rel="manifest" href="./mixer/manifest.json"/><title>React App</title><link href="./mixer/static/css/2.0b7c8b97.chunk.css" rel="stylesheet"><link href="./mixer/static/css/main.375af961.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,i,l=r[0],f=r[1],a=r[2],c=0,s=[];c<l.length;c++)i=l[c],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&s.push(o[i][0]),o[i]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,l=1;l<t.length;l++){var f=t[l];0!==o[f]&&(n=!1)}n&&(u.splice(r--,1),e=i(i.s=t[0]))}return e}var n={},o={1:0},u=[];function i(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.m=e,i.c=n,i.d=function(e,r,t){i.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,r){if(1&r&&(e=i(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(i.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)i.d(t,n,function(r){return e[r]}.bind(null,n));return t},i.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(r,"a",r),r},i.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},i.p="./mixer/";var l=this.webpackJsonpmixer=this.webpackJsonpmixer||[],f=l.push.bind(l);l.push=r,l=l.slice();for(var a=0;a<l.length;a++)r(l[a]);var p=f;t()}([])</script><script src="./mixer/static/js/2.f2aad125.chunk.js"></script><script src="./mixer/static/js/main.5f5e49d2.chunk.js"></script></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./mixer/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="./mixer/logo192.png"/><link rel="manifest" href="./mixer/manifest.json"/><title>React App</title><link href="./mixer/static/css/2.0b7c8b97.chunk.css" rel="stylesheet"><link href="./mixer/static/css/main.1be3e506.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,i,l=r[0],f=r[1],a=r[2],c=0,s=[];c<l.length;c++)i=l[c],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&s.push(o[i][0]),o[i]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,l=1;l<t.length;l++){var f=t[l];0!==o[f]&&(n=!1)}n&&(u.splice(r--,1),e=i(i.s=t[0]))}return e}var n={},o={1:0},u=[];function i(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.m=e,i.c=n,i.d=function(e,r,t){i.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,r){if(1&r&&(e=i(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(i.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)i.d(t,n,function(r){return e[r]}.bind(null,n));return t},i.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(r,"a",r),r},i.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},i.p="./mixer/";var l=this.webpackJsonpmixer=this.webpackJsonpmixer||[],f=l.push.bind(l);l.push=r,l=l.slice();for(var a=0;a<l.length;a++)r(l[a]);var p=f;t()}([])</script><script src="./mixer/static/js/2.edf0bfe8.chunk.js"></script><script src="./mixer/static/js/main.6a7a8d48.chunk.js"></script></body></html>

View File

@ -0,0 +1,34 @@
self.__precacheManifest = (self.__precacheManifest || []).concat([
{
"revision": "c478e196f0e356e1ecb0908ac7d5cfbb",
"url": "./mixer/index.html"
},
{
"revision": "58d7b02ebe439df1498d",
"url": "./mixer/static/css/2.0b7c8b97.chunk.css"
},
{
"revision": "5d634dc6ddb3fad90f05",
"url": "./mixer/static/css/main.1be3e506.chunk.css"
},
{
"revision": "58d7b02ebe439df1498d",
"url": "./mixer/static/js/2.edf0bfe8.chunk.js"
},
{
"revision": "4390933dc3b3a92d4f565fd4f47c3cd7",
"url": "./mixer/static/js/2.edf0bfe8.chunk.js.LICENSE.txt"
},
{
"revision": "5d634dc6ddb3fad90f05",
"url": "./mixer/static/js/main.6a7a8d48.chunk.js"
},
{
"revision": "5c84e2504d745b1010aeb6ce2aad7554",
"url": "./mixer/static/js/main.6a7a8d48.chunk.js.LICENSE.txt"
},
{
"revision": "96af6c8d9af51963848a",
"url": "./mixer/static/js/runtime-main.c45edf70.js"
}
]);

View File

@ -14,7 +14,7 @@
importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
importScripts(
"./mixer/precache-manifest.1a06c0869ff880086e3a9be9dac86c16.js"
"./mixer/precache-manifest.abb42691e68409f9e64fbfb6933199f3.js"
);
self.addEventListener('message', (event) => {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,80 @@
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/*!
Copyright (c) 2018 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
/*!
* cookie
* Copyright(c) 2012-2014 Roman Shtylman
* Copyright(c) 2015 Douglas Christopher Wilson
* MIT Licensed
*/
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
/** @license React v0.19.1
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.13.1
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.14.0
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.14.0
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v17.0.2
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,26 @@
/*!
* Sizzle CSS Selector Engine v2.3.4
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
* Date: 2019-04-08
*/
/*!
* jQuery JavaScript Library v3.4.1
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2019-05-01T21:04Z
*/
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */

View File

@ -776,7 +776,7 @@ input[type="password"]::-ms-reveal{
width: 100%;
height: 100%;
background: black;
z-index: 999;
z-index: 1;
font-size: 60px;
color: white;
transition: .3s color, .3s border;
@ -871,6 +871,24 @@ input[type="password"]::-ms-reveal{
left: 9px;
border-radius: 50%;
}
.menu .simplebar-content {
height: 100% !important;
}
.menu .search-item-icon {
font-size: 22px;
line-height: 1;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
}
.menu .search-input:focus {
box-shadow: none;
}
.login .card {
border-radius: 1rem;
@ -889,7 +907,7 @@ input[type="password"]::-ms-reveal{
}
.login .input-group input {
line-height: 2.5rem;
line-height: 2.39rem;
font-size: 1.2rem;
border-left-width: 2px !important;
}
@ -992,7 +1010,8 @@ input[type="password"]::-ms-reveal{
border-radius: 4px;
}
.dashboard .hdmi, .sdi{
.dashboard .hdmi,
.dashboard .sdi{
width: 68px;
display: inline-block;
}
@ -1000,20 +1019,18 @@ input[type="password"]::-ms-reveal{
.dashboard .hdmi .icon {
display: inline-block;
background-image:url(../../assets/img/input.png);
/*margin:0 auto;*/
width:68px;
height:26px;
/*margin-top: 14px;*/
/*margin-bottom: 14px;*/
background-position:0px -54px;
height:30px;
margin-top: 13px !important;
margin-bottom: 14px !important;
background-position:0px -50px;
}
.dashboard .sdi .icon {
display: inline-block;
background-image:url(../../assets/img/input.png);
/*margin:0 auto;*/
width:45px;
height:54px;
height:50px;
background-position:0px 0px;
}

View File

@ -424,6 +424,31 @@
border-color: var(--bs-border-color-translucent);
}
[data-bs-theme=dark] .menu .search-input {
border-color: var(--bs-border-color-translucent) !important;
}
[data-bs-theme=dark] .menu .search-input::placeholder {
color: var(--bs-body-color-semi) !important;
}
[data-bs-theme=dark] .menu .search-bar-icon {
color: #666 !important;
}
[data-bs-theme=dark] .menu .search-item-icon {
background-color: var(--bs-default-bg-color);
border: 1px solid var(--bs-border-color-translucent);
}
[data-bs-theme=dark] .menu .search-item-option {
border-color: var(--bs-border-color-translucent) !important;
}
[data-bs-theme=dark] .menu .search-tip-text {
color: #888 !important;
}
[data-bs-theme=dark] .login {
/*background-color: #202122;*/
background-color: var(--bs-default-body-bg-color);
@ -513,7 +538,8 @@
color: var(--bs-body-color-semi);
}
[data-bs-theme=dark] .dashboard .hdmi, .sdi{
[data-bs-theme=dark] .dashboard .hdmi,
[data-bs-theme=dark] .dashboard .sdi{
filter: brightness(70%);
}

View File

@ -350,6 +350,11 @@
background-color: #fff;
}
[data-bs-theme=default] .menu .search-item-icon {
background-color: #ffffff;
border: 1px solid #d8d8d8;
}
[data-bs-theme=default] .login {
background-color: var(--bs-body-bg-color);
width: 100%;

View File

@ -1,5 +1,6 @@
import vue from "./vue.build.js";
const {onMounted, ref, toRefs, watchEffect} = vue;
import mutationObserver from "../plugins/polyfill/mutationobserver.esm.js";
const { ref,onMounted } = vue;
export const wifiFlagComponent = {
template: `<div>
@ -183,3 +184,49 @@ export const antenanFlagComponent = {
}
}
}
export const emptyBoxFlagComponent = {
template: `<div class="text-center">
<svg v-if="defTheme === 'default'" width="100" height="64" viewBox="0 0 64 41" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(0 1)" fill="none" fill-rule="evenodd">
<ellipse style="fill: #f5f5f5" cx="32" cy="33" rx="32" ry="7"></ellipse>
<g style="stroke: #d9d9d9;" fill-rule="nonzero">
<path d="M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z"></path>
<path style="fill: #fafafa" d="M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z"></path>
</g>
</g>
</svg>
<svg v-if="defTheme === 'dark'" width="100" height="64" viewBox="0 0 64 41" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(0 1)" fill="none" fill-rule="evenodd">
<ellipse style="fill: #444" cx="32" cy="33" rx="32" ry="7"></ellipse>
<g style="stroke: #555;" fill-rule="nonzero">
<path d="M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z"></path>
<path style="fill: #555" d="M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z"></path>
</g>
</g>
</svg>
</div>`,
setup(props,context) {
const defTheme = ref("");
onMounted(()=>{
const update = () => {
const theme = html.getAttribute('data-bs-theme');
defTheme.value = theme;
}
const html = document.querySelector('html');
update();
const observer = new mutationObserver(() => {
update();
});
const config = {
attributes: true,
attributeFilter: ["data-bs-theme"],
subtree: false
};
observer.observe(html, config);
})
return { defTheme }
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -201,7 +201,7 @@
<script type="module">
import { rpc,confirm,func,checkFileExists,clearReactiveArray } from "./assets/js/lp.utils.js";
import { useDefaultConf,useResConf } from "./assets/js/vue.hooks.js";
import {ignoreCustomElementPlugin,bootstrapSwitchComponent,nouiSliderComponent,uploadModalComponent,languageOptionDirective} from "./assets/js/vue.helper.js"
import {ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,nouiSliderComponent,uploadModalComponent,languageOptionDirective} from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watchEffect,computed} = vue;
@ -332,6 +332,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -65,7 +65,7 @@
<div class="col-lg-12">
<div class="card">
<div class="card-body iface py-3">
<div v-for="(item,index) in input" :key="index" :class="['me-5',{'hdmi':item.protocol==='HDMI'},{'sdi':item.protocol==='SDI'},{'disable':!item.avalible}]">
<div v-for="(item,index) in input" :key="index" :class="[{'ms-5':index > 0},{'hdmi':item.protocol==='HDMI'},{'sdi':item.protocol==='SDI' || item.protocol==='AHD'},{'disable':!item.avalible}]">
<span class="info">{{item.info}}</span>
<div class="icon my-1"></div>
<span class="name">{{item.name}}</span>
@ -114,7 +114,7 @@
<script type="module">
import { rpc } from "./assets/js/lp.utils.js";
import { useDefaultConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,statusPieChartComponent,statusTemperatureComponent,netFlotChartComponent } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,statusPieChartComponent,statusTemperatureComponent,netFlotChartComponent } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
import mutationObserver from './assets/plugins/polyfill/mutationobserver.esm.js';
@ -300,6 +300,7 @@
}
})
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app')
</script>
</body>

View File

@ -92,7 +92,7 @@
<div class="col-lg-12">
<button type="button" class="btn border-3 btn-primary me-2" @click="saveGlobalConfByLocal">
<cn>应用到全部</cn>
<en>Apply to all/en>
<en>Apply to all</en>
</button>
</div>
</div>
@ -353,7 +353,7 @@
import { rpc, extend, deepCopy, confirm, swap, clearReactiveArray, clearReactiveObject, formatTime, alertMsg } from "./assets/js/lp.utils.js";
import { useDefaultConf,useUsbFilesConf,useHardwareConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,multipleSelectComponent,nouiSliderComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,multipleSelectComponent,nouiSliderComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watch,toRefs,computed,onMounted} = vue;
@ -536,6 +536,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -171,30 +171,34 @@
<div class="col-1"></div>
<div class="col-11">
<div class="row">
<div class="col-2 text-center">
<div class="col text-center">
<cn>编码格式</cn>
<en>codec</en>
</div>
<div class="col-2 text-center">
<div class="col text-center">
<cn>音源</cn>
<en>source</en>
</div>
<div class="col-2 text-center">
<div class="col text-center">
<cn>增益</cn>
<en>gain</en>
</div>
<div class="col-2 text-center">
<div class="col text-center">
<cn>采样率</cn>
<en>samplerate</en>
</div>
<div class="col-2 text-center">
<div class="col text-center">
<cn>声道</cn>
<en>channels</en>
</div>
<div class="col-2 text-center">
<div class="col text-center">
<cn>码率(kb/s)</cn>
<en>bitrate(kb/s)</en>
</div>
<div v-if="Object.keys(hardwareConf).length > 0 && hardwareConf.model==='ENC8'" class="col text-center">
<cn>音轨</cn>
<en>audio track</en>
</div>
</div>
</div>
</div>
@ -253,6 +257,12 @@
<div class="col">
<input type="text" class="form-control" v-model.trim.lazy="globalConf.enca.bitrate">
</div>
<div v-if="Object.keys(hardwareConf).length > 0 && hardwareConf.model==='ENC8'" class="col text-center">
<select class="form-select" v-model.number="globalConf.enca.audioTrack">
<option cn="源-Line" en="source-line" value="1" v-language-option></option>
<option cn="源-Hdmi" en="source-hdmi" value="2" v-language-option></option>
</select>
</div>
</div>
</div>
</div>
@ -261,7 +271,7 @@
<div class="col-lg-12">
<button type="button" class="btn border-3 btn-primary me-2" @click="saveGlobalConfByLocal">
<cn>应用到全部</cn>
<en>Apply to all/en>
<en>Apply to all</en>
</button>
</div>
</div>
@ -487,16 +497,20 @@
<en>smart encode</en>
</div>
<div class="col text-center">
minQP
<cn>minQP</cn>
<en>minQP</en>
</div>
<div class="col text-center">
maxQP
<cn>maxQP</cn>
<en>maxQP</en>
</div>
<div class="col text-center">
fixIQP
<cn>fixIQP</cn>
<en>fixIQP</en>
</div>
<div class="col text-center">
fixPQP
<cn>fixPQP</cn>
<en>fixPQP</en>
</div>
<div class="col text-center">
<cn>低延时编码</cn>
@ -679,6 +693,10 @@
<cn>码率(kb/s)</cn>
<en>bitrate(kb/s)</en>
</div>
<div v-if="Object.keys(hardwareConf).length > 0 && hardwareConf.model==='ENC8'" class="col text-center">
<cn>音轨</cn>
<en>audio track</en>
</div>
</div>
<hr >
<div class="row mt-1" v-for="(item,index) in handleAdoConf" :key="item.id">
@ -733,6 +751,12 @@
<div class="col">
<input type="text" class="form-control" v-model.trim.lazy="item.enca.bitrate">
</div>
<div v-if="Object.keys(hardwareConf).length > 0 && hardwareConf.model==='ENC8'" class="col">
<select v-if="item.enca.audioTrack" class="form-select" v-model.number="item.enca.audioTrack">
<option cn="源-Line" en="source-line" value="1" v-language-option></option>
<option cn="源-Hdmi" en="source-hdmi" value="2" v-language-option></option>
</select>
</div>
</div>
<hr >
</div>
@ -840,7 +864,7 @@
import { extend,deepCopy,confirm } from "./assets/js/lp.utils.js";
import { useDefaultConf,useHardwareConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,multipleSelectComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,multipleSelectComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,reactive,watch,toRefs,computed,onMounted} = vue;
@ -918,6 +942,8 @@
extend(defaultConf[i].enca, deepCopy(globalConf.enca));
if(defaultConf[i].enca.audioSrc === "source")
defaultConf[i].enca.audioSrc = defaultConf[i].id;
if(defaultConf[i].type !== "vi" && defaultConf[i].enca.hasOwnProperty("audioTrack"))
delete defaultConf[i].enca.audioTrack;
}
saveDefaultConf();
}
@ -960,6 +986,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -20,7 +20,7 @@
</div>
</div>
<div class="card-body" >
<div class="row mt-3">
<div class="row mt-2">
<div class="col-lg-4 d-flex lp-align-center">
<cn>机型</cn>
<en>Model</en>
@ -31,7 +31,16 @@
</select>
</div>
</div>
<div class="row my-3">
<div class="row mt-3">
<div class="col-lg-4 d-flex lp-align-center">
<cn>类型</cn>
<en>Chip</en>
</div>
<div class="col-lg-8">
<input class="form-control" type="text" v-model.trim.lazy="chip" readonly disabled>
</div>
</div>
<div class="row mt-3">
<div class="col-lg-12 text-center">
<button type="button" class="btn btn-primary border-2 px-3" @click="updateFacConf">
<cn>保存</cn>
@ -53,7 +62,7 @@
</div>
</div>
<div class="card-body" >
<div class="row mt-3">
<div class="row">
<div class="col-lg-4 d-flex lp-align-center">
<cn>认证模式</cn>
<en>Auth</en>
@ -67,7 +76,7 @@
</select>
</div>
</div>
<div class="row my-3">
<div class="row mt-3">
<div class="col-lg-12 text-center">
<button type="button" class="btn btn-primary border-2 px-3" @click="updateLphConf">
<cn>保存</cn>
@ -215,6 +224,7 @@
<?php include ("./public/foot.inc") ?>
<script type="module">
import { rpc } from "./assets/js/lp.utils.js"
import { useHardwareConf,useFacConf,useLphConf,useColorModeConf,useEdidConf,useMcuConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
@ -237,6 +247,7 @@
const { mcuConf } = useMcuConf();
const showMcuVersion = ref(false);
const chip = ref("");
watchEffect(()=>{
if(Object.keys(hardwareConf).length > 0)
@ -245,8 +256,10 @@
showMcuVersion.value = true;
})
return {hardwareConf,updateHardwareConf,curFac,facConf,updateFacConf, colorModeConf,
updateColorModeConf,edidConf,updateEdidConf,lphConf,updateLphConf,mcuConf,showMcuVersion}
onMounted(()=>rpc("enc.getChip").then(data => chip.value = data));
return {hardwareConf,updateHardwareConf,curFac,facConf,updateFacConf, colorModeConf, updateColorModeConf,
edidConf,updateEdidConf,lphConf,updateLphConf,mcuConf,showMcuVersion,chip}
}
});
app.use(ignoreCustomElementPlugin);

View File

@ -236,7 +236,7 @@
import vue from "./assets/js/vue.build.js";
import { rpc } from "./assets/js/lp.utils.js";
import { useDefaultConf,useGb28181Conf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent } from "./assets/js/vue.helper.js"
const {createApp,ref,reactive,watchEffect,computed,onMounted,nextTick} = vue;
const app = createApp({
@ -296,6 +296,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -509,7 +509,7 @@
<div class="col-lg-12">
<button type="button" class="btn border-3 btn-primary me-2" @click="showSyncModal('enc')">
<cn>应用到群组</cn>
<en>Apply to all/en>
<en>Apply to all</en>
</button>
</div>
</div>
@ -606,7 +606,7 @@
<div class="col-lg-12">
<button type="button" class="btn border-3 btn-primary me-2" @click="showSyncModal('stream')">
<cn>应用到群组</cn>
<en>Apply to all/en>
<en>Apply to all</en>
</button>
</div>
</div>
@ -622,7 +622,7 @@
<script type="module">
import {rpc, alertMsg, splitArray, confirm, clearReactiveArray, isEmpty, deepCopy} from "./assets/js/lp.utils.js";
import { useDefaultConf,useGroupConf,useHardwareConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,multipleSelectComponent,multipleInputComponent,
import { ignoreCustomElementPlugin,filterKeywordPlugin,multipleSelectComponent,multipleInputComponent,
languageOptionDirective,bootstrapSwitchComponent,customModalComponent } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
@ -914,6 +914,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -113,7 +113,7 @@
<script type="module">
import { rpc } from "./assets/js/lp.utils.js";
import { useDefaultConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,ptzDirectComponent } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,ptzDirectComponent } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watchEffect,onMounted,nextTick} = vue;
@ -238,6 +238,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -341,7 +341,7 @@
<script type="module">
import { rpc,alertMsg,clearReactiveObject } from "./assets/js/lp.utils.js";
import { useIntercomConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,languageOptionDirective,customModalComponent } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,languageOptionDirective,customModalComponent } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watch,watchEffect,computed,onMounted} = vue;
@ -438,6 +438,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -37,12 +37,14 @@ class User extends Verify
if($index == -1 || $passwd != $passes[$index]['passwd'])
return $this->handleRet('','error','用户名密码错误','the user name or password is incorrect');
session_start();
$data = array(
'L-HASH' => $this->get_hash(),
'P-HASH' => $this->get_hash(),
'H-HASH' => $this->get_hash()
'H-HASH' => $this->get_hash(),
'Cookie' => 'PHPSESSID='.session_id()
);
session_start();
foreach ($data as $key => $value)
$_SESSION[$key] = $value;

View File

@ -2,6 +2,7 @@
namespace Link\Ctx;
use DOMDocument;
use Link\Basic;
class Root extends Basic
{
@ -132,4 +133,78 @@ class Root extends Basic
exec('/usr/nginx/sbin/nginx -p /usr/nginx -s reload');
return $this->handleRet($param, 'success', '保存成功', 'save successfully');
}
function filterKeywords($param) {
$filter = $param["filter"];
$lang = $param["lang"];
$result = array();
$content = file_get_contents("/link/webflex/public/menu.inc");
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML(mb_convert_encoding($content,"HTML-ENTITIES","UTF-8"));
libxml_clear_errors();
$aTags = $dom->getElementsByTagName('a');
$menus = array();
foreach ($aTags as $aTag) {
$href = $aTag->getAttribute('href');
if (!empty($href) && $href != "javascript:;") {
$iTag = $aTag->getElementsByTagName("i");
$iClass = $iTag[0]->getAttribute("class");
$cnTag = $aTag->getElementsByTagName($lang);
$menus[$href] = array(
"icon" => $iClass,
"name" => $cnTag[0]->nodeValue
);
}
}
$phpFiles = glob('/link/webflex' . '/*.php');
$ignoreFiles = ["fac.php","ndireg.php"];
foreach ($phpFiles as $phpFile) {
if (in_array(basename($phpFile), $ignoreFiles))
continue;
$content = file_get_contents($phpFile);
preg_match('/<main\b[^>]*>(.*?)<\/main>/s', $content, $matches);
if (isset($matches[1])) {
$main = $matches[1];
preg_match_all('/<'.$lang.'>(.*?)<\/'.$lang.'>/s', $main, $matches);
$lst = array();
foreach ($matches[1] as $ctx) {
if(stripos($ctx,$filter) !== false)
array_push($lst,strip_tags($ctx));
}
if(!empty($lst)) {
$name = $menus[basename($phpFile)]["name"];
$icon = $menus[basename($phpFile)]["icon"];
$ary = array(
"url" => basename($phpFile),
"name" => $name,
"icon" => $icon,
"filter" => array_unique($lst)
);
array_push($result,$ary);
}
}
}
return $this->handleRet($result, 'success', '保存成功', 'save successfully');
}
function getFilterKeywords($param) {
$lang = self::load_conf("/link/config/lang.json");
$url = basename($param["url"]);
$filter = $param["filter"];
$content = file_get_contents("/link/webflex/".$url);
preg_match('/<main\b[^>]*>(.*?)<\/main>/s', $content, $matches);
$result = "";
if (isset($matches[1])) {
$main = $matches[1];
preg_match_all('/<'.$lang["lang"].'>(.*?)<\/'.$lang["lang"].'>/s', $main, $matches);
foreach ($matches[1] as $ctx) {
if(md5(strip_tags($ctx)) == $filter)
$result = strip_tags($ctx);
}
}
return $this->handleRet($result, 'success', '保存成功', 'save successfully');
}
}

View File

@ -10,7 +10,7 @@ require __DIR__ . '/autoload.php';
$param = file_get_contents("php://input");
if(is_null(json_decode($param)))
$param = json_encode($_POST);
$param = json_decode(urldecode($param),true);
$param = json_decode($param,true);
try
{

View File

@ -55,12 +55,11 @@ function copyUserSettings(&$historyConfig, &$currentConfig,&$level=0) {
$configFiles = getConfFiles('/tmp/history_config');
foreach ($configFiles as $historyFile) {
$currentFile = str_replace("/tmp/history_config/","/link/config/",$historyFile);
if(md5_file($historyFile) == md5_file($currentFile))
if(!strpos($currentFile, ".json") || md5_file($historyFile) == md5_file($currentFile))
continue;
if(!strpos($currentFile, ".json") || strpos($currentFile, "version.json") ||
strpos($currentFile, "net.json") || strpos($currentFile, "net2.json") ||
strpos($currentFile, "netEx.json") || strpos($currentFile,"netManager.json"))
$ignoreFiles = ['version.json', 'net.json', 'net2.json', 'netEx.json', 'netManager.json', 'verLogs.json'];
if (in_array(basename($currentFile), $ignoreFiles))
continue;
$historyCtx = json_decode(file_get_contents($historyFile));

View File

@ -92,7 +92,7 @@
import { rpc,confirm } from "./assets/js/lp.utils.js";
import { useDefaultConf,useDefLaysConf,useHardwareConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,nouiSliderComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,nouiSliderComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import mutationObserver from './assets/plugins/polyfill/mutationobserver.esm.js';
import vue from "./assets/js/vue.build.js";
@ -229,7 +229,9 @@
const onChangeLayout = () => {
let layout = [];
let srcV = [];
let mark = false;
let srcA = [];
let markV = false;
let markA = false;
for(let i=0;i<defLaysConf.length;i++) {
if(state.curLayId.value === defLaysConf[i].layId) {
let las = defLaysConf[i].layouts;
@ -239,20 +241,27 @@
srcV.push("-1");
} else {
srcV.push(las[j].id + "");
mark = true;
markV = true;
if(las[j].ado) {
srcA.push(las[j].id + "")
markA = true;
}
}
}
}
}
if(!mark) {
if(!markV) {
if (srcV.length >= defaultConf[state.mixIndex.value].srcV.length)
srcV.splice(0, defaultConf[state.mixIndex.value].srcV.length, ...defaultConf[state.mixIndex.value].srcV);
else
srcV = defaultConf[state.mixIndex.value].srcV.slice(0, srcV.length);
}
defaultConf[state.mixIndex.value].srcV.splice(0, defaultConf[state.mixIndex.value].srcV.length, ...srcV);
defaultConf[state.mixIndex.value].layout.splice(0, defaultConf[state.mixIndex.value].layout.length, ...layout);
if(markA)
defaultConf[state.mixIndex.value].srcA.splice(0, defaultConf[state.mixIndex.value].srcA.length, ...srcA);
updateDefaultConf("noTip");
const options = document.querySelectorAll(`option[cn]`);
options.forEach(option => {
@ -294,6 +303,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -1,26 +1,26 @@
{
"files": {
"main.css": "./mixer/static/css/main.375af961.chunk.css",
"main.js": "./mixer/static/js/main.5f5e49d2.chunk.js",
"main.js.map": "./mixer/static/js/main.5f5e49d2.chunk.js.map",
"main.css": "./mixer/static/css/main.1be3e506.chunk.css",
"main.js": "./mixer/static/js/main.6a7a8d48.chunk.js",
"main.js.map": "./mixer/static/js/main.6a7a8d48.chunk.js.map",
"runtime-main.js": "./mixer/static/js/runtime-main.c45edf70.js",
"runtime-main.js.map": "./mixer/static/js/runtime-main.c45edf70.js.map",
"static/css/2.0b7c8b97.chunk.css": "./mixer/static/css/2.0b7c8b97.chunk.css",
"static/js/2.f2aad125.chunk.js": "./mixer/static/js/2.f2aad125.chunk.js",
"static/js/2.f2aad125.chunk.js.map": "./mixer/static/js/2.f2aad125.chunk.js.map",
"static/js/2.edf0bfe8.chunk.js": "./mixer/static/js/2.edf0bfe8.chunk.js",
"static/js/2.edf0bfe8.chunk.js.map": "./mixer/static/js/2.edf0bfe8.chunk.js.map",
"index.html": "./mixer/index.html",
"precache-manifest.1a06c0869ff880086e3a9be9dac86c16.js": "./mixer/precache-manifest.1a06c0869ff880086e3a9be9dac86c16.js",
"precache-manifest.abb42691e68409f9e64fbfb6933199f3.js": "./mixer/precache-manifest.abb42691e68409f9e64fbfb6933199f3.js",
"service-worker.js": "./mixer/service-worker.js",
"static/css/2.0b7c8b97.chunk.css.map": "./mixer/static/css/2.0b7c8b97.chunk.css.map",
"static/css/main.375af961.chunk.css.map": "./mixer/static/css/main.375af961.chunk.css.map",
"static/js/2.f2aad125.chunk.js.LICENSE.txt": "./mixer/static/js/2.f2aad125.chunk.js.LICENSE.txt",
"static/js/main.5f5e49d2.chunk.js.LICENSE.txt": "./mixer/static/js/main.5f5e49d2.chunk.js.LICENSE.txt"
"static/css/main.1be3e506.chunk.css.map": "./mixer/static/css/main.1be3e506.chunk.css.map",
"static/js/2.edf0bfe8.chunk.js.LICENSE.txt": "./mixer/static/js/2.edf0bfe8.chunk.js.LICENSE.txt",
"static/js/main.6a7a8d48.chunk.js.LICENSE.txt": "./mixer/static/js/main.6a7a8d48.chunk.js.LICENSE.txt"
},
"entrypoints": [
"static/js/runtime-main.c45edf70.js",
"static/css/2.0b7c8b97.chunk.css",
"static/js/2.f2aad125.chunk.js",
"static/css/main.375af961.chunk.css",
"static/js/main.5f5e49d2.chunk.js"
"static/js/2.edf0bfe8.chunk.js",
"static/css/main.1be3e506.chunk.css",
"static/js/main.6a7a8d48.chunk.js"
]
}

View File

@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./mixer/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="./mixer/logo192.png"/><link rel="manifest" href="./mixer/manifest.json"/><title>React App</title><link href="./mixer/static/css/2.0b7c8b97.chunk.css" rel="stylesheet"><link href="./mixer/static/css/main.375af961.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,i,l=r[0],f=r[1],a=r[2],c=0,s=[];c<l.length;c++)i=l[c],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&s.push(o[i][0]),o[i]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,l=1;l<t.length;l++){var f=t[l];0!==o[f]&&(n=!1)}n&&(u.splice(r--,1),e=i(i.s=t[0]))}return e}var n={},o={1:0},u=[];function i(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.m=e,i.c=n,i.d=function(e,r,t){i.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,r){if(1&r&&(e=i(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(i.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)i.d(t,n,function(r){return e[r]}.bind(null,n));return t},i.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(r,"a",r),r},i.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},i.p="./mixer/";var l=this.webpackJsonpmixer=this.webpackJsonpmixer||[],f=l.push.bind(l);l.push=r,l=l.slice();for(var a=0;a<l.length;a++)r(l[a]);var p=f;t()}([])</script><script src="./mixer/static/js/2.f2aad125.chunk.js"></script><script src="./mixer/static/js/main.5f5e49d2.chunk.js"></script></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./mixer/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="./mixer/logo192.png"/><link rel="manifest" href="./mixer/manifest.json"/><title>React App</title><link href="./mixer/static/css/2.0b7c8b97.chunk.css" rel="stylesheet"><link href="./mixer/static/css/main.1be3e506.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,i,l=r[0],f=r[1],a=r[2],c=0,s=[];c<l.length;c++)i=l[c],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&s.push(o[i][0]),o[i]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,l=1;l<t.length;l++){var f=t[l];0!==o[f]&&(n=!1)}n&&(u.splice(r--,1),e=i(i.s=t[0]))}return e}var n={},o={1:0},u=[];function i(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.m=e,i.c=n,i.d=function(e,r,t){i.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,r){if(1&r&&(e=i(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(i.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)i.d(t,n,function(r){return e[r]}.bind(null,n));return t},i.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(r,"a",r),r},i.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},i.p="./mixer/";var l=this.webpackJsonpmixer=this.webpackJsonpmixer||[],f=l.push.bind(l);l.push=r,l=l.slice();for(var a=0;a<l.length;a++)r(l[a]);var p=f;t()}([])</script><script src="./mixer/static/js/2.edf0bfe8.chunk.js"></script><script src="./mixer/static/js/main.6a7a8d48.chunk.js"></script></body></html>

View File

@ -0,0 +1,34 @@
self.__precacheManifest = (self.__precacheManifest || []).concat([
{
"revision": "c478e196f0e356e1ecb0908ac7d5cfbb",
"url": "./mixer/index.html"
},
{
"revision": "58d7b02ebe439df1498d",
"url": "./mixer/static/css/2.0b7c8b97.chunk.css"
},
{
"revision": "5d634dc6ddb3fad90f05",
"url": "./mixer/static/css/main.1be3e506.chunk.css"
},
{
"revision": "58d7b02ebe439df1498d",
"url": "./mixer/static/js/2.edf0bfe8.chunk.js"
},
{
"revision": "4390933dc3b3a92d4f565fd4f47c3cd7",
"url": "./mixer/static/js/2.edf0bfe8.chunk.js.LICENSE.txt"
},
{
"revision": "5d634dc6ddb3fad90f05",
"url": "./mixer/static/js/main.6a7a8d48.chunk.js"
},
{
"revision": "5c84e2504d745b1010aeb6ce2aad7554",
"url": "./mixer/static/js/main.6a7a8d48.chunk.js.LICENSE.txt"
},
{
"revision": "96af6c8d9af51963848a",
"url": "./mixer/static/js/runtime-main.c45edf70.js"
}
]);

View File

@ -14,7 +14,7 @@
importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
importScripts(
"./mixer/precache-manifest.1a06c0869ff880086e3a9be9dac86c16.js"
"./mixer/precache-manifest.abb42691e68409f9e64fbfb6933199f3.js"
);
self.addEventListener('message', (event) => {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,80 @@
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/*!
Copyright (c) 2018 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
/*!
* cookie
* Copyright(c) 2012-2014 Roman Shtylman
* Copyright(c) 2015 Douglas Christopher Wilson
* MIT Licensed
*/
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
/** @license React v0.19.1
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.13.1
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.14.0
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.14.0
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v17.0.2
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,26 @@
/*!
* Sizzle CSS Selector Engine v2.3.4
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
* Date: 2019-04-08
*/
/*!
* jQuery JavaScript Library v3.4.1
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2019-05-01T21:04Z
*/
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */

View File

@ -98,7 +98,7 @@
<script type="module">
import { rpc,alertMsg } from "./assets/js/lp.utils.js";
import { useDefaultConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watchEffect,onMounted,nextTick} = vue;
@ -172,6 +172,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -473,7 +473,7 @@
import vue from "./assets/js/vue.build.js";
import { alertMsg,rpc5,clearReactiveArray,isEmpty } from "./assets/js/lp.utils.js";
import {useDefaultConf, usePtzConf} from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,h5PlayerComponent,bootstrapSwitchComponent,nouiSliderComponent,ptzDirectComponent,languageOptionDirective,loadingButtonComponent,customModalComponent } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,h5PlayerComponent,bootstrapSwitchComponent,nouiSliderComponent,ptzDirectComponent,languageOptionDirective,loadingButtonComponent,customModalComponent } from "./assets/js/vue.helper.js"
const {createApp,ref,reactive,watchEffect,computed,onMounted} = vue;
const app = createApp({
@ -877,6 +877,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -360,7 +360,7 @@
<script type="module">
import { useDefaultConf,useHardwareConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,nouiSliderComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,nouiSliderComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watchEffect,computed,onMounted} = vue;
@ -396,6 +396,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -404,7 +404,7 @@
<script type="module">
import { rpc,alertMsg,confirm,func } from "./assets/js/lp.utils.js";
import { useDefaultConf,useOverlayConf,useResConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,nouiSliderComponent,vueColorPickerComponent,uploadModalComponent } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,nouiSliderComponent,vueColorPickerComponent,uploadModalComponent } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watchEffect,computed} = vue;
@ -572,6 +572,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -63,7 +63,7 @@
<?php include ("./public/foot.inc") ?>
<script type="module">
import { useDefaultConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,h5PlayerComponent } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,h5PlayerComponent } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watch,watchEffect,computed,onMounted} = vue;
@ -125,6 +125,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -5,12 +5,12 @@
<div class="btn-toggle-menu" @click="onToggleMenu">
<i class="fa-solid fa-bars"></i>
</div>
<!-- <div class="position-relative search-bar d-lg-block d-none" data-bs-toggle="modal" data-bs-target="#searchModal">-->
<!-- <input class="form-control form-control-sm rounded-5 px-5" disabled type="search" placeholder="Search">-->
<!-- <span class="position-absolute ms-3 translate-middle-y start-0 top-50">-->
<!-- <i class="fa fa-search"></i>-->
<!-- </span>-->
<!-- </div>-->
<div class="position-relative search-bar d-lg-block d-none" @click="onShowSearchModal">
<input class="form-control form-control-sm rounded-5 px-5 lp-cursor-pointer" type="search" :placeholder="placeholderVal" readonly>
<span class="position-absolute ms-3 translate-middle-y start-0 top-50">
<i class="fa fa-search"></i>
</span>
</div>
<ul class="navbar-nav top-right-menu gap-2">
<li class="nav-item">
<a class="nav-link" style="font-size: 20px;">
@ -24,7 +24,7 @@
<i v-else class="fa-regular fa-sun" @click="updateThemeConf('default')"></i>
</a>
</li>
<li class="nav-item" v-if="Object.keys(hardwareConf).length > 0 && hardwareConf.fac !== 'REC1'">
<li class="nav-item" v-if="Object.keys(hardwareConf).length > 0 && (hardwareConf.fac !== 'REC1' || hardwareConf.fac !== 'ENC8')">
<a class="nav-link" style="font-size: 19px;" @click="changeWeb">
<i class="fa-solid fa-arrow-right-arrow-left"></i>
</a>
@ -83,7 +83,7 @@
<li>
<a href="push.php">
<div class="parent-icon"><i class="fa-solid fa-fan"></i></div>
<div class="menu-title"><cn>直播推流</cn><en>Multiple Push</en></div>
<div class="menu-title"><cn>直播推流</cn><en>Push</en></div>
</a>
</li>
<li v-if="Object.keys(hardwareConf).length > 0 && hardwareConf.function.videoOut">
@ -111,7 +111,7 @@
<div class="menu-title"><cn>视频混合</cn><en>Video mix</en></div>
</a>
</li>
<li class="menu-label"><cn>其他设置</cn><en>Exte0nd</en></li>
<li class="menu-label"><cn>其他设置</cn><en>OTHER</en></li>
<li>
<a href="javascript:;" class="has-arrow">
<div class="parent-icon"><i class="fa-solid fa-puzzle-piece ms-1 mb-1"></i></div>
@ -171,7 +171,7 @@
<li>
<a href="service.php">
<i class="fa-solid fa-cloud"></i>
<div class="menu-title"><cn>服务设置</cn><en>Reverse Proxy</en></div>
<div class="menu-title"><cn>服务设置</cn><en>Service</en></div>
</a>
</li>
</ul>
@ -185,25 +185,25 @@
<li>
<a href="gb28181.php">
<i class="fa-solid fa-cloud"></i>
<div class="menu-title">GB28181</div>
<div class="menu-title"><cn>GB28181</cn><en>GB28181</en></div>
</a>
</li>
<li>
<a href="roi.php">
<i class="fa-solid fa-circle-user"></i>
<div class="menu-title">ROI</div>
<div class="menu-title"><cn>ROI</cn><en>ROI</en></div>
</a>
</li>
<li>
<a href="insta360.php">
<i class="fa-solid fa-camera"></i>
<div class="menu-title">Insta360 Link</div>
<div class="menu-title"><cn>Insta360 Link</cn><en>Insta360 Link</en></div>
</a>
</li>
<li>
<a href="onvif.php">
<i class="fa fa-video-camera"></i>
<div class="menu-title">Onvif PTZ</div>
<div class="menu-title"><cn>Onvif PTZ</cn><en>Onvif PTZ</en></div>
</a>
</li>
<li>
@ -237,20 +237,68 @@
</div>
</div>
</aside>
<div class="modal fade" tabindex="-1" aria-hidden="true" ref="modal">
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-lg" style="z-index: 99999">
<div class="modal-content">
<div class="modal-header gap-2">
<div class="position-relative popup-search w-100">
<input class="form-control form-control-lg ps-5 border border-2 search-input" type="text" v-model.trim="searchVal">
<span class="position-absolute ms-3 translate-middle-y start-0 top-50">
<i class="fa fa-search search-bar-icon"></i>
</span>
</div>
</div>
<div class="modal-body" style="height: 350px">
<div data-simplebar>
<div v-if="searchRes.length > 0" class="search-list">
<div class="mb-4" v-for="(item,index) in searchRes" :key="index">
<div class="d-flex">
<div class="search-item-icon"><i :class="['font-14',item.icon]"></i></div>
<span class="mb-2 ms-2 font-16">{{item.name}}</span>
</div>
<div class="list-group">
<a v-for="(itm,idx) in item.filter" :key="idx" @click="onRedirect(item.url,itm)" class="list-group-item list-group-item-action align-items-center d-flex gap-2 lp-cursor-pointer search-item-option">{{itm}}</a>
</div>
</div>
</div>
<div v-else class="h-100 lp-align-center">
<div>
<div class="row">
<empty-box></empty-box>
</div>
<div class="row mt-3">
<div class="text-center search-tip-text">
<cn>请输入要检索的标题关键字</cn>
<en>Please enter the keyword you want to search</en>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal-backdrop show" @click="onHideSearchModal"></div>
</div>
</menu>
</div>
<script src="../assets/plugins/passive/passive.events.min.js"></script>
<script type="module">
import vue from "../assets/js/vue.build.js";
import { func,updateSysLanguage,confirm } from "../assets/js/lp.utils.js";
import Metismenu from '../assets/plugins/metismenu/js/metisMenu.esm.js';
import mutationObserver from "../assets/plugins/polyfill/mutationobserver.esm.js";
import { func,updateSysLanguage,confirm,isEmpty,clearReactiveArray } from "../assets/js/lp.utils.js";
import { useThemeConf,useHardwareConf } from "../assets/js/vue.hooks.js"
import { ignoreCustomElementPlugin,usbOptionComponent } from "../assets/js/vue.helper.js"
import Metismenu from '../assets/plugins/metismenu/js/metisMenu.esm.js';
import { emptyBoxFlagComponent } from "../assets/js/vue.flags.js"
import { md5 } from "../assets/plugins/md5/js.md5.esm.js";
const { createApp,ref,watchEffect,watch,nextTick,onMounted } = vue;
const { createApp,ref,reactive,watchEffect,watch,nextTick,onMounted } = vue;
const menu = createApp({
components:{
"usb-option": usbOptionComponent,
"empty-box": emptyBoxFlagComponent
},
setup() {
const { themeConf,updateThemeConf } = useThemeConf();
@ -260,7 +308,12 @@
metismenu: ref(null),
isMenuToggled : ref(false),
isSidebarHovered: ref(false),
showFormatModal: ref(false)
showFormatModal: ref(false),
modal: ref(null),
bsModal: ref(null),
searchVal: ref(""),
searchRes: reactive([]),
placeholderVal: ref("关键字")
}
const onLogout = () => {
@ -294,7 +347,21 @@
}
})
watchEffect(()=>{
watch(state.searchVal, () => {
if (isEmpty(state.searchVal.value)) {
clearReactiveArray(state.searchRes);
return;
}
const html = document.querySelector("html");
const lang = html.getAttribute('data-bs-language');
const param = {"lang": lang, "filter": state.searchVal.value};
func("/root/filterKeywords", param).then(result => {
clearReactiveArray(state.searchRes);
state.searchRes.push(...result.data);
});
});
watch(state.isMenuToggled,() => {
const body = document.querySelector('body');
if(state.isMenuToggled.value)
body.classList.add('toggled');
@ -343,12 +410,48 @@
});
}
const onShowSearchModal = () => {
state.bsModal.value.show();
const ele = document.querySelector("body > .modal-backdrop");
ele.remove();
}
const onHideSearchModal = () => {
state.bsModal.value.hide();
}
const onRedirect = (url,data) => {
location.href = url+"?filter="+md5(data);
}
onMounted(()=>{
new Metismenu(state.metismenu.value);
state.bsModal.value = new bootstrap.Modal(state.modal.value);
const update = () => {
const lang = html.getAttribute('data-bs-language');
if(lang === "cn")
state.placeholderVal.value = "关键字";
else
state.placeholderVal.value = "Search";
}
const html = document.querySelector('html');
update();
const observer = new mutationObserver(() => {
update();
});
const config = {
attributes: true,
attributeFilter: ["data-bs-language"],
subtree: false
};
observer.observe(html, config);
});
return {...state,hardwareConf,themeConf,updateThemeConf,onHrefDash,onLogout,onToggleMenu,
onMouseEnter,onMouseLeave,onCloseSidebar,updateSysLanguage,changeWeb}
onMouseEnter,onMouseLeave,onCloseSidebar,updateSysLanguage,changeWeb,onShowSearchModal,
onHideSearchModal,onRedirect}
}
});
menu.use(ignoreCustomElementPlugin);

View File

@ -285,7 +285,7 @@
<script type="module">
import { rpc,func,alertMsg } from "./assets/js/lp.utils.js";
import { useDefaultConf,usePushConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,h5PlayerComponent,timepickerComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,h5PlayerComponent,timepickerComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watchEffect,computed,onMounted} = vue;
@ -458,6 +458,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -50,19 +50,34 @@
<div class="col-lg-12">
<div class="row row-cols-5">
<div class="col-lg ps-4">
<label>Mp4</label>
<label>
<cn>MP4</cn>
<en>MP4</en>
</label>
</div>
<div class="col-lg ps-4">
<label>TS</label>
<label>
<cn>TS</cn>
<en>TS</en>
</label>
</div>
<div class="col-lg ps-4">
<label>FLV</label>
<label>
<cn>FLV</cn>
<en>FLV</en>
</label>
</div>
<div class="col-lg ps-4">
<label>MKV</label>
<label>
<cn>MKV</cn>
<en>MKV</en>
</label>
</div>
<div class="col-lg ps-4">
<label>MOV</label>
<label>
<cn>MOV</cn>
<en>MOV</en>
</label>
</div>
</div>
</div>
@ -158,19 +173,24 @@
<en>Channel name</en>
</div>
<div class="col text-center">
MP4
<cn>MP4</cn>
<en>MP4</en>
</div>
<div class="col text-center">
TS
<cn>TS</cn>
<en>TS</en>
</div>
<div class="col text-center">
FLV
<cn>FLV</cn>
<en>FLV</en>
</div>
<div class="col text-center">
MKV
<cn>MKV</cn>
<en>MKV</en>
</div>
<div class="col text-center">
MOV
<cn>MOV</cn>
<en>MOV</en>
</div>
<div class="col text-center">
<cn>暂停</cn>
@ -304,7 +324,7 @@
<script type="module">
import {rpc, func, alertMsg, confirm} from "./assets/js/lp.utils.js";
import { useDefaultConf,useRecordConf,useRecordFiles } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,customModalComponent,videoPlayerComponent } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,customModalComponent,videoPlayerComponent } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watchEffect,computed,onMounted} = vue;
@ -563,6 +583,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -100,7 +100,8 @@
<div class="row">
<div class="col-lg-3 offset-lg-1 lp-align-center">
<label>
QP
<cn>QP</cn>
<en>QP</en>
</label>
</div>
<div class="col-lg-6">
@ -142,7 +143,7 @@
import vueDragResize from "./assets/plugins/vueDragResize/js/vue3-drag-resize.esm.js";
import { rpc,deepCopy } from "./assets/js/lp.utils.js";
import { useDefaultConf,useRoiConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
const {createApp,ref,reactive,watchEffect,computed,nextTick,onMounted} = vue;
const app = createApp({
@ -233,6 +234,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -157,7 +157,7 @@
<script type="module">
import { rpc4,func,alertMsg } from "./assets/js/lp.utils.js";
import { useMqttConf,useRttyConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,customModalComponent } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,customModalComponent } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watch,watchEffect,computed,onMounted} = vue;
@ -226,6 +226,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -159,7 +159,7 @@
<script type="module">
import { alertMsg } from "./assets/js/lp.utils.js";
import { useServiceConf,useSlsConf,useRtmpConf,useNdiConf,useFrpEnableConf,useFrpcConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent } from "./assets/js/vue.helper.js";
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent } from "./assets/js/vue.helper.js";
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watch,watchEffect,computed,onMounted} = vue;
@ -206,6 +206,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -23,16 +23,20 @@
<div class="row">
<div class="col-2"></div>
<div class="col text-center">
HTTP
<cn>HTTP</cn>
<en>HTTP</en>
</div>
<div v-if="Object.keys(hardwareConf).length > 0 && hardwareConf.function.hls" class="col text-center">
HLS
<cn>HLS</cn>
<en>HLS</en>
</div>
<div class="col text-center">
RTMP
<cn>RTMP</cn>
<en>RTMP</en>
</div>
<div class="col text-center">
RTSP
<cn>RTSP</cn>
<en>RTSP</en>
</div>
<div class="col text-center">
<cn>组播</cn>
@ -110,7 +114,7 @@
<div class="col-lg-12">
<button type="button" class="btn border-3 btn-primary me-2" @click="saveGlobalConfByLocal">
<cn>应用到全部</cn>
<en>Apply to all/en>
<en>Apply to all</en>
</button>
</div>
</div>
@ -128,7 +132,7 @@
<a class="nav-link active" data-bs-toggle="tab" href="#tab1" role="tab" aria-selected="true">
<div class="d-flex align-items-center">
<div class="tab-icon"><i class="fa-solid fa-upload me-1"></i></div>
<div class="tab-title"><cn>码流配置</cn><en>Encode config</en></div>
<div class="tab-title"><cn>码流配置</cn><en>Stream config</en></div>
</div>
</a>
</li>
@ -136,7 +140,7 @@
<a class="nav-link" data-bs-toggle="tab" href="#tab2" role="tab" aria-selected="false">
<div class="d-flex align-items-center">
<div class="tab-icon"><i class="fa-solid fa-gear me-1"></i></div>
<div class="tab-title"><cn>TS设置</cn><en>Advanced Encode config</en></div>
<div class="tab-title"><cn>TS设置</cn><en>TS config</en></div>
</div>
</a>
</li>
@ -144,7 +148,7 @@
<a class="nav-link" data-bs-toggle="tab" href="#tab3" role="tab" aria-selected="false">
<div class="d-flex align-items-center">
<div class="tab-icon"><i class="fa-solid fa-gear me-1"></i></div>
<div class="tab-title"><cn>HLS设置</cn><en>Video config</en></div>
<div class="tab-title"><cn>HLS设置</cn><en>HLS config</en></div>
</div>
</a>
</li>
@ -152,7 +156,7 @@
<a class="nav-link" data-bs-toggle="tab" href="#tab4" role="tab" aria-selected="false">
<div class="d-flex align-items-center">
<div class="tab-icon"><i class="fa-solid fa-gear me-1"></i></div>
<div class="tab-title"><cn>RTSP设置</cn><en>Audio config</en></div>
<div class="tab-title"><cn>RTSP设置</cn><en>RTSP config</en></div>
</div>
</a>
</li>
@ -161,7 +165,7 @@
<a class="nav-link" data-bs-toggle="tab" href="#tab5" role="tab" aria-selected="false">
<div class="d-flex align-items-center">
<div class="tab-icon"><i class="fa-solid fa-gear me-1"></i></div>
<div class="tab-title"><cn>SRT设置</cn><en>Audio config</en></div>
<div class="tab-title"><cn>SRT设置</cn><en>SRT config</en></div>
</div>
</a>
</li>
@ -169,7 +173,7 @@
<a class="nav-link" data-bs-toggle="tab" href="#tab6" role="tab" aria-selected="false">
<div class="d-flex align-items-center">
<div class="tab-icon"><i class="fa-solid fa-gear me-1"></i></div>
<div class="tab-title"><cn>NDI设置</cn><en>Audio config</en></div>
<div class="tab-title"><cn>NDI设置</cn><en>NDI config</en></div>
</div>
</a>
</li>
@ -177,7 +181,7 @@
<a class="nav-link" data-bs-toggle="tab" href="#tab7" role="tab" aria-selected="false">
<div class="d-flex align-items-center">
<div class="tab-icon"><i class="fa-solid fa-podcast me-1"></i></div>
<div class="tab-title"><cn>推流设置</cn><en>Audio config</en></div>
<div class="tab-title"><cn>推流设置</cn><en>Push config</en></div>
</div>
</a>
</li>
@ -185,7 +189,7 @@
<a class="nav-link" data-bs-toggle="tab" href="#tab8" role="tab" aria-selected="false">
<div class="d-flex align-items-center">
<div class="tab-icon"><i class="fa-regular fa-circle-play me-1"></i></div>
<div class="tab-title"><cn>播放地址</cn><en>Audio config</en></div>
<div class="tab-title"><cn>播放地址</cn><en>Play URL</en></div>
</div>
</a>
</li>
@ -198,16 +202,20 @@
<en>Channel name</en>
</div>
<div class="col text-center">
HTTP
<cn>HTTP</cn>
<en>HTTP</en>
</div>
<div v-if="Object.keys(hardwareConf).length > 0 && hardwareConf.function.hls" class="col text-center">
HLS
<cn>HLS</cn>
<en>HLS</en>
</div>
<div class="col text-center">
RTMP
<cn>RTMP</cn>
<en>RTMP</en>
</div>
<div class="col text-center">
RTSP
<cn>RTSP</cn>
<en>RTSP</en>
</div>
<div class="col text-center">
<cn>组播</cn>
@ -756,7 +764,7 @@
import {rpc, extend, deepCopy, clearReactiveArray} from "./assets/js/lp.utils.js";
import { useDefaultConf,useHardwareConf,usePortConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,multipleInputComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,multipleInputComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,toRefs,watch,watchEffect,computed} = vue;
@ -931,6 +939,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -144,7 +144,7 @@
<script type="module">
import { useSyncConf } from "./assets/js/vue.hooks.js";
import {ignoreCustomElementPlugin, bootstrapSwitchComponent, nouiSliderComponent} from "./assets/js/vue.helper.js"
import {ignoreCustomElementPlugin,filterKeywordPlugin, bootstrapSwitchComponent, nouiSliderComponent} from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watchEffect,computed,onMounted} = vue;
@ -188,6 +188,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -70,7 +70,8 @@
<div v-if="Object.keys(hardwareConf).length > 0 && hardwareConf.function.dhcp" class="row mt-3">
<div class="col-lg-2 offset-lg-1 lp-align-center">
<label>
DHCP
<cn>DHCP</cn>
<en>DHCP</en>
</label>
</div>
<div class="col-lg-5">
@ -80,7 +81,8 @@
<div class="row mt-3">
<div class="col-lg-2 offset-lg-1 lp-align-center">
<label>
IP
<cn>IP</cn>
<en>IP</en>
</label>
</div>
<div class="col-lg-6">
@ -112,7 +114,8 @@
<div class="row mt-3">
<div class="col-lg-2 offset-lg-1 lp-align-center">
<label>
DNS
<cn>DNS</cn>
<en>DNS</en>
</label>
</div>
<div class="col-lg-6">
@ -122,7 +125,8 @@
<div class="row mt-3">
<div class="col-lg-2 offset-lg-1 lp-align-center">
<label>
MAC
<cn>MAC</cn>
<en>MAC</en>
</label>
</div>
<div class="col-lg-6">
@ -214,7 +218,8 @@
<div class="row mt-4">
<div class="col-lg-3 lp-align-center">
<label>
DHCP
<cn>DHCP</cn>
<en>DHCP</en>
</label>
</div>
<div class="col-lg-8">
@ -224,7 +229,8 @@
<div class="row mt-3">
<div class="col-lg-3 lp-align-center">
<label>
IP
<cn>IP</cn>
<en>IP</en>
</label>
</div>
<div class="col-lg-8">
@ -256,7 +262,8 @@
<div class="row mt-3">
<div class="col-lg-3 lp-align-center">
<label>
DNS
<cn>DNS</cn>
<en>DNS</en>
</label>
</div>
<div class="col-lg-8">
@ -320,7 +327,8 @@
<div class="row mt-3">
<div class="col-lg-2 offset-lg-1 lp-align-center">
<label>
IP
<cn>IP</cn>
<en>IP</en>
</label>
</div>
<div class="col-lg-6">
@ -365,60 +373,52 @@
</div>
<div class="card-body">
<div class="row">
<div class="row">
<div class="col-lg-2 offset-lg-1 lp-align-center">
<label>
<cn>旧密码</cn>
<en>Current</en>
</label>
</div>
<div class="col-lg-6">
<div class="input-group">
<form>
<input class="form-control" :type="!showPasswd.oldpwd ? 'password' : 'text'" v-model.trim.lazy="userPasswd.oldpwd" autocomplete="off">
</form>
<span class="input-group-text input-group-addon lp-cursor-pointer" @click="showPasswd.oldpwd = !showPasswd.oldpwd"><i :class="['fa-regular',{'fa-eye-slash':showPasswd.oldpwd},{'fa-eye':!showPasswd.oldpwd}]"></i></span>
</div>
<div class="col-lg-2 offset-lg-1 lp-align-center">
<label>
<cn>旧密码</cn>
<en>Current</en>
</label>
</div>
<div class="col-lg-6">
<div class="input-group">
<input class="form-control" :type="!showPasswd.oldpwd ? 'password' : 'text'" v-model.trim.lazy="userPasswd.oldpwd" autocomplete="off">
<span class="input-group-text input-group-addon lp-cursor-pointer" @click="showPasswd.oldpwd = !showPasswd.oldpwd"><i :class="['fa-regular',{'fa-eye-slash':showPasswd.oldpwd},{'fa-eye':!showPasswd.oldpwd}]"></i></span>
</div>
</div>
<div class="row mt-3">
<div class="col-lg-2 offset-lg-1 lp-align-center">
</div>
<div class="row mt-3">
<div class="col-lg-2 offset-lg-1 lp-align-center">
<label>
<label>
<label>
<cn>新密码</cn>
<en>New</en>
</label>
<cn>新密码</cn>
<en>New</en>
</label>
</div>
<div class="col-lg-6">
<div class="input-group">
<form>
<input class="form-control" :type="!showPasswd.newpwd ? 'password' : 'text'" v-model.trim.lazy="userPasswd.newpwd" autocomplete="off">
</form>
<span class="input-group-text input-group-addon lp-cursor-pointer" @click="showPasswd.newpwd = !showPasswd.newpwd"><i :class="['fa-regular',{'fa-eye-slash':showPasswd.newpwd},{'fa-eye':!showPasswd.newpwd}]"></i></span>
</div>
</label>
</div>
<div class="col-lg-6">
<div class="input-group">
<input class="form-control" :type="!showPasswd.newpwd ? 'password' : 'text'" v-model.trim.lazy="userPasswd.newpwd" autocomplete="off">
<span class="input-group-text input-group-addon lp-cursor-pointer" @click="showPasswd.newpwd = !showPasswd.newpwd"><i :class="['fa-regular',{'fa-eye-slash':showPasswd.newpwd},{'fa-eye':!showPasswd.newpwd}]"></i></span>
</div>
</div>
<div class="row mt-3">
<div class="col-lg-2 offset-lg-1 lp-align-center">
<label>
<cn>确认密码</cn>
<en>Confirm</en>
</label>
</div>
<div class="col-lg-6">
<div class="input-group">
<form>
<input class="form-control" :type="!showPasswd.confirm ? 'password' : 'text'" v-model.trim.lazy="userPasswd.confirm" autocomplete="off">
</form>
<span class="input-group-text input-group-addon lp-cursor-pointer" @click="showPasswd.confirm = !showPasswd.confirm"><i :class="['fa-regular',{'fa-eye-slash':showPasswd.confirm},{'fa-eye':!showPasswd.confirm}]"></i></span>
</div>
</div>
<div class="row mt-3">
<div class="col-lg-2 offset-lg-1 lp-align-center">
<label>
<cn>确认密码</cn>
<en>Confirm</en>
</label>
</div>
<div class="col-lg-6">
<div class="input-group">
<input class="form-control" :type="!showPasswd.confirm ? 'password' : 'text'" v-model.trim.lazy="userPasswd.confirm" autocomplete="off">
<span class="input-group-text input-group-addon lp-cursor-pointer" @click="showPasswd.confirm = !showPasswd.confirm"><i :class="['fa-regular',{'fa-eye-slash':showPasswd.confirm},{'fa-eye':!showPasswd.confirm}]"></i></span>
</div>
</div>
<div class="row mt-3">
<div class="col-lg-12 text-center">
<button type="button" class="btn border-3 btn-primary px-4" @click="updateUserPasswd(userPasswd)"><cn>保存</cn><en>Save</en></button>
</div>
</div>
<div class="row mt-3">
<div class="col-lg-12 text-center">
<button type="button" class="btn border-3 btn-primary px-4" @click="updateUserPasswd(userPasswd)"><cn>保存</cn><en>Save</en></button>
</div>
</div>
</div>
@ -977,12 +977,13 @@
<script type="module">
import vue from "./assets/js/vue.build.js";
import JsZip from "./assets/plugins/jszip/jszip.esm.js"
import * as fileSave from "./assets/plugins/jszip/filesaver.esm.js";
import { rpc2,alertMsg,func,queryData,popover,formatDate,rebootConfirm,resetConfirm,clearReactiveObject } from "./assets/js/lp.utils.js";
import { useHardwareConf,useNetManagerConf,usePasswordConf,useVideoBufferConf,useNtpConf,useTimezoneConf,usePortConf,useVersionConf,useVerLogsConf,useWpaConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,languageOptionDirective,uploadModalComponent,upgradeModalComponent,customModalComponent,loadingButtonComponent } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,languageOptionDirective,uploadModalComponent,upgradeModalComponent,customModalComponent,loadingButtonComponent } from "./assets/js/vue.helper.js"
import { wifiFlagComponent,antenanFlagComponent } from "./assets/js/vue.flags.js";
import axios from './assets/plugins/axios/axios.esm.js';
import JsZip from "./assets/plugins/jszip/jszip.esm.js"
import * as fileSave from "./assets/plugins/jszip/filesaver.esm.js";
const { createApp,ref,reactive,watch,watchEffect,computed,onMounted } = vue;
const app = createApp({
@ -1217,7 +1218,7 @@
}
const promiseArray = confs.map((conf) => {
return queryData("config/" + conf, { responseType: 'blob' }).then(data => ({ name: conf, data }));
return queryData("config/" + conf, { responseType: 'blob' }).then(data => ({ name: conf, data })).catch(error => "");
});
Promise.all(promiseArray)
@ -1237,7 +1238,7 @@
saveAs(blob, 'configs.zip');
})
.catch(error => {
console.error(error);
console.error("下载全部失败");
});
}
@ -1388,6 +1389,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

View File

@ -139,7 +139,7 @@
<script type="module">
import { rpc,rpc6,alertMsg } from "./assets/js/lp.utils.js";
import { useHardwareConf,useButtonConf,useUartConf } from "./assets/js/vue.hooks.js";
import { ignoreCustomElementPlugin,bootstrapSwitchComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import { ignoreCustomElementPlugin,filterKeywordPlugin,bootstrapSwitchComponent,languageOptionDirective } from "./assets/js/vue.helper.js"
import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watch,watchEffect,computed} = vue;
@ -178,6 +178,7 @@
}
});
app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app');
</script>
</body>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.