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 { rtmp {
server { server {
listen 1935; listen 1935 so_keepalive=2s:3:1;
chunk_size 10240; chunk_size 10240;
wait_video on; wait_video on;
application live{ 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", "version": "2.9.0 build 20231229",
"logs": [ "logs": [

View File

@ -1,5 +1,5 @@
{ {
"app": "2.0.0 build 20220512_869", "app": "2.0.0 build 20220512_869",
"sdk": "2.0.0 build 20220518_20716", "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 if [ -f /link/bin/Monitor ];then
/link/shell/monitor.sh & /link/shell/monitor.sh &
fi fi
if [ -f /link/bin/TFT ];then
/link/shell/tft.sh &
fi

View File

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

View File

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

View File

@ -1,5 +1,11 @@
if [ ! -f "/link/config/mac" ] || [ ! -s /link/config/mac ] || [ -z "$(cat /link/config/mac)" ]; then if [ ! -f "/link/config/mac" ] || [ ! -s /link/config/mac ] || [ -z "$(cat /link/config/mac)" ]; then
/link/shell/makeMac.sh > /link/config/mac /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 fi
/sbin/ifconfig eth0 down /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']; $result['srcA'] = $item['srcA'];
foreach ($defLays as $defLay) foreach ($defLays as $defLay)
{ {
$layList = []; $layList = [];$layList1=[];
$layouts = $defLay['layouts']; $layouts = $defLay['layouts'];
foreach ($layouts as $layout) foreach ($layouts as $layout)
{ {
$pos = $layout['pos']; $pos = $layout['pos'];
//按顺序生成新对象,方便后面对比 //按顺序生成新对象,方便后面对比
$lay = array( $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'], 'a' => $pos['a'],
'h' => $pos['h'], 'h' => $pos['h'],
'index' => $pos['index'], 'index' => $pos['index'],
@ -60,9 +70,9 @@ class Layout extends Verify
'x' => $pos['x'], 'x' => $pos['x'],
'y' => $pos ['y'] '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['curLayId'] = $defLay['layId'];
$result['curLayName'] = $defLay['layName']; $result['curLayName'] = $defLay['layName'];

View File

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

View File

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

View File

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

View File

@ -1,26 +1,26 @@
{ {
"files": { "files": {
"main.css": "./mixer/static/css/main.375af961.chunk.css", "main.css": "./mixer/static/css/main.1be3e506.chunk.css",
"main.js": "./mixer/static/js/main.5f5e49d2.chunk.js", "main.js": "./mixer/static/js/main.6a7a8d48.chunk.js",
"main.js.map": "./mixer/static/js/main.5f5e49d2.chunk.js.map", "main.js.map": "./mixer/static/js/main.6a7a8d48.chunk.js.map",
"runtime-main.js": "./mixer/static/js/runtime-main.c45edf70.js", "runtime-main.js": "./mixer/static/js/runtime-main.c45edf70.js",
"runtime-main.js.map": "./mixer/static/js/runtime-main.c45edf70.js.map", "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/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.edf0bfe8.chunk.js": "./mixer/static/js/2.edf0bfe8.chunk.js",
"static/js/2.f2aad125.chunk.js.map": "./mixer/static/js/2.f2aad125.chunk.js.map", "static/js/2.edf0bfe8.chunk.js.map": "./mixer/static/js/2.edf0bfe8.chunk.js.map",
"index.html": "./mixer/index.html", "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", "service-worker.js": "./mixer/service-worker.js",
"static/css/2.0b7c8b97.chunk.css.map": "./mixer/static/css/2.0b7c8b97.chunk.css.map", "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/css/main.1be3e506.chunk.css.map": "./mixer/static/css/main.1be3e506.chunk.css.map",
"static/js/2.f2aad125.chunk.js.LICENSE.txt": "./mixer/static/js/2.f2aad125.chunk.js.LICENSE.txt", "static/js/2.edf0bfe8.chunk.js.LICENSE.txt": "./mixer/static/js/2.edf0bfe8.chunk.js.LICENSE.txt",
"static/js/main.5f5e49d2.chunk.js.LICENSE.txt": "./mixer/static/js/main.5f5e49d2.chunk.js.LICENSE.txt" "static/js/main.6a7a8d48.chunk.js.LICENSE.txt": "./mixer/static/js/main.6a7a8d48.chunk.js.LICENSE.txt"
}, },
"entrypoints": [ "entrypoints": [
"static/js/runtime-main.c45edf70.js", "static/js/runtime-main.c45edf70.js",
"static/css/2.0b7c8b97.chunk.css", "static/css/2.0b7c8b97.chunk.css",
"static/js/2.f2aad125.chunk.js", "static/js/2.edf0bfe8.chunk.js",
"static/css/main.375af961.chunk.css", "static/css/main.1be3e506.chunk.css",
"static/js/main.5f5e49d2.chunk.js" "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("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
importScripts( importScripts(
"./mixer/precache-manifest.1a06c0869ff880086e3a9be9dac86c16.js" "./mixer/precache-manifest.abb42691e68409f9e64fbfb6933199f3.js"
); );
self.addEventListener('message', (event) => { 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%; width: 100%;
height: 100%; height: 100%;
background: black; background: black;
z-index: 999; z-index: 1;
font-size: 60px; font-size: 60px;
color: white; color: white;
transition: .3s color, .3s border; transition: .3s color, .3s border;
@ -871,6 +871,24 @@ input[type="password"]::-ms-reveal{
left: 9px; left: 9px;
border-radius: 50%; 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 { .login .card {
border-radius: 1rem; border-radius: 1rem;
@ -889,7 +907,7 @@ input[type="password"]::-ms-reveal{
} }
.login .input-group input { .login .input-group input {
line-height: 2.5rem; line-height: 2.39rem;
font-size: 1.2rem; font-size: 1.2rem;
border-left-width: 2px !important; border-left-width: 2px !important;
} }
@ -992,7 +1010,8 @@ input[type="password"]::-ms-reveal{
border-radius: 4px; border-radius: 4px;
} }
.dashboard .hdmi, .sdi{ .dashboard .hdmi,
.dashboard .sdi{
width: 68px; width: 68px;
display: inline-block; display: inline-block;
} }
@ -1000,20 +1019,18 @@ input[type="password"]::-ms-reveal{
.dashboard .hdmi .icon { .dashboard .hdmi .icon {
display: inline-block; display: inline-block;
background-image:url(../../assets/img/input.png); background-image:url(../../assets/img/input.png);
/*margin:0 auto;*/
width:68px; width:68px;
height:26px; height:30px;
/*margin-top: 14px;*/ margin-top: 13px !important;
/*margin-bottom: 14px;*/ margin-bottom: 14px !important;
background-position:0px -54px; background-position:0px -50px;
} }
.dashboard .sdi .icon { .dashboard .sdi .icon {
display: inline-block; display: inline-block;
background-image:url(../../assets/img/input.png); background-image:url(../../assets/img/input.png);
/*margin:0 auto;*/
width:45px; width:45px;
height:54px; height:50px;
background-position:0px 0px; background-position:0px 0px;
} }

View File

@ -424,6 +424,31 @@
border-color: var(--bs-border-color-translucent); 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 { [data-bs-theme=dark] .login {
/*background-color: #202122;*/ /*background-color: #202122;*/
background-color: var(--bs-default-body-bg-color); background-color: var(--bs-default-body-bg-color);
@ -513,7 +538,8 @@
color: var(--bs-body-color-semi); 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%); filter: brightness(70%);
} }

View File

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

View File

@ -1,5 +1,6 @@
import vue from "./vue.build.js"; 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 = { export const wifiFlagComponent = {
template: `<div> 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 }
}
}

View File

@ -1,15 +1,14 @@
import vue from "./vue.build.js"; import vue from "./vue.build.js";
import $ from '../plugins/jquery/jquery.esm.js'; import $ from '../plugins/jquery/jquery.esm.js';
import '../plugins/switch/js/bootstrap-switch.min.js'; import '../plugins/switch/js/bootstrap-switch.min.js';
import "../plugins/timepicker/js/bootstrap-timepicker.js"; import "../plugins/timepicker/js/bootstrap-timepicker.js";
import * as noUiSlider from "../plugins/nouislider/js/nouislider.esm.js"; import * as noUiSlider from "../plugins/nouislider/js/nouislider.esm.js";
import mutationObserver from '../plugins/polyfill/mutationobserver.esm.js' import mutationObserver from '../plugins/polyfill/mutationobserver.esm.js'
import { func, confirm, rebootConfirm, alertMsg, axios_post, isEmpty,formatTime } from './lp.utils.js' import { md5 } from "../plugins/md5/js.md5.esm.js";
import { func, confirm, rebootConfirm, alertMsg, axios_post, isEmpty, formatTime, clearReactiveArray, getUrlParam } from './lp.utils.js'
import { useDiskConf } from "./vue.hooks.js"; import { useDiskConf } from "./vue.hooks.js";
const {ref,reactive,toRefs,watch,watchEffect, const { ref, reactive, toRefs, watch, watchEffect, computed, onMounted, nextTick, defineAsyncComponent } = vue;
computed,onMounted,nextTick,defineAsyncComponent} = vue;
export const ignoreCustomElementPlugin = { export const ignoreCustomElementPlugin = {
install: (app) => { install: (app) => {
@ -17,35 +16,66 @@ export const ignoreCustomElementPlugin = {
} }
}; };
export const highlightTextPlugin = { export const filterKeywordPlugin = {
install(app, options) { install(app) {
//const urlParam = options.urlParam || 'highlight'; const filter = getUrlParam("filter");
//const urlValue = new URLSearchParams(window.location.search).get(urlParam); if(!filter)
const urlValue = "预" return;
if (urlValue) { const param = {"url":location.pathname, "filter":filter}
nextTick(()=>{ func("/root/getFilterKeywords",param).then(result => {
const keyword = result.data;
if (keyword) {
// nextTick(() => {
setTimeout(()=>{
const elements = document.querySelectorAll('main cn, main en'); const elements = document.querySelectorAll('main cn, main en');
elements.forEach((el) => { elements.forEach((el) => {
const textContent = el.textContent; const textContent = el.textContent;
const startIndex = textContent.indexOf(urlValue); const startIndex = textContent.indexOf(keyword);
if (startIndex !== -1) { if (startIndex !== -1) {
const endIndex = startIndex + urlValue.length; let currentElement = el.parentNode;
while (currentElement) {
currentElement = currentElement.parentNode;
if(currentElement) {
let classList = currentElement.classList;
if(classList && classList.contains("tab-pane")) {
let tabId = currentElement.id;
let navLinks = document.querySelectorAll(".nav.nav-tabs > .nav-item > .nav-link");
navLinks.forEach(item => {
if (item.getAttribute('href') === '#'+tabId) {
if(item.classList)
item.classList.add("active");
} else {
if(item.classList)
item.classList.remove("active");
}
})
const siblings = Array.from(currentElement.parentElement.children);
siblings.forEach((sibling) => {
sibling.classList.remove('active');
sibling.classList.remove('show');
});
currentElement.classList.add('active');
currentElement.classList.add('show');
}
}
}
const endIndex = startIndex + keyword.length;
const beforeText = textContent.slice(0, startIndex); const beforeText = textContent.slice(0, startIndex);
const highlightedText = textContent.slice(startIndex, endIndex); const highlightedText = textContent.slice(startIndex, endIndex);
const afterText = textContent.slice(endIndex); const afterText = textContent.slice(endIndex);
const highlightedElement = document.createElement('span'); const highlightedElement = document.createElement('span');
highlightedElement.style.fontWeight = '700'; highlightedElement.style.fontWeight = '700';
highlightedElement.style.color = 'red'; highlightedElement.style.color = 'red';
highlightedElement.textContent = highlightedText; highlightedElement.textContent = highlightedText;
el.innerHTML = beforeText; el.innerHTML = beforeText;
el.appendChild(highlightedElement); el.appendChild(highlightedElement);
el.innerHTML += afterText; el.innerHTML += afterText;
} }
}) })
}) },100);
// })
} }
})
} }
}; };
@ -326,8 +356,7 @@ export const netFlotChartComponent = {
if (item.seriesIndex === 1) if (item.seriesIndex === 1)
showTooltip(item.pageX + 100, item.pageY - 10, color, "<cn>下行</cn><en>downward</en>: " + data); showTooltip(item.pageX + 100, item.pageY - 10, color, "<cn>下行</cn><en>downward</en>: " + data);
} }
} } else {
else {
prePoint = null; prePoint = null;
preLabel = null; preLabel = null;
$(this).css({ $(this).css({
@ -762,7 +791,8 @@ export const h5PlayerComponent = {
state.h5Player = {}; state.h5Player = {};
} }
state.cloudHandler.value.style.display = 'flex'; state.cloudHandler.value.style.display = 'flex';
state.videoHandler.value.removeEventListener("canplay",()=>{}); state.videoHandler.value.removeEventListener("canplay", () => {
});
state.hadInitPlayer = false; state.hadInitPlayer = false;
} }
const checkDelay = () => { const checkDelay = () => {
@ -835,7 +865,8 @@ export const videoPlayerComponent = {
const destroyPlayer = () => { const destroyPlayer = () => {
state.cloudHandler.value.style.display = 'flex'; state.cloudHandler.value.style.display = 'flex';
state.videoHandler.value.removeEventListener("canplay",()=>{}); state.videoHandler.value.removeEventListener("canplay", () => {
});
state.hadInitPlayer = false; state.hadInitPlayer = false;
} }
@ -1508,7 +1539,15 @@ export const upgradeModalComponent = {
context.emit('update:checkUpgrade', false); context.emit('update:checkUpgrade', false);
}); });
}) })
return { ...state,modalFade,handleVersionLogs,showPatchVersionLog,hidePatchVersionLog,handleUpdatePatch,handleDownloadPatch } return {
...state,
modalFade,
handleVersionLogs,
showPatchVersionLog,
hidePatchVersionLog,
handleUpdatePatch,
handleDownloadPatch
}
} }
} }
@ -1594,6 +1633,8 @@ export const customModalComponent = {
} }
watch(modalShow, () => { watch(modalShow, () => {
if (Object.keys(state.bsModal).length === 0)
return;
state.show = !state.show; state.show = !state.show;
if (state.show) if (state.show)
state.bsModal.show(); state.bsModal.show();
@ -1871,7 +1912,6 @@ export const ptzDirectComponent = {
} }
watch(() => props.zoomVal, (newValue, oldValue) => { watch(() => props.zoomVal, (newValue, oldValue) => {
console.log(newValue);
state.zoom.value = newValue; state.zoom.value = newValue;
}) })
@ -1971,7 +2011,8 @@ export const usbOptionComponent = {
}, },
cancel: { cancel: {
text: "<cn>取消</cn><en>Cancel</en>", text: "<cn>取消</cn><en>Cancel</en>",
action: () => {} action: () => {
}
} }
} }
}); });
@ -2050,7 +2091,8 @@ export const usbOptionComponent = {
}, },
cancel: { cancel: {
text: "<cn>取消</cn><en>Cancel</en>", text: "<cn>取消</cn><en>Cancel</en>",
action: () => {} action: () => {
}
} }
} }
}); });
@ -2195,7 +2237,8 @@ export const usbOptionComponent = {
}, },
cancel: { cancel: {
text: "<cn>取消</cn><en>Cancel</en>", text: "<cn>取消</cn><en>Cancel</en>",
action: () => {} action: () => {
}
} }
}, },
onOpenBefore: () => { onOpenBefore: () => {

File diff suppressed because one or more lines are too long

View File

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

View File

@ -65,7 +65,7 @@
<div class="col-lg-12"> <div class="col-lg-12">
<div class="card"> <div class="card">
<div class="card-body iface py-3"> <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> <span class="info">{{item.info}}</span>
<div class="icon my-1"></div> <div class="icon my-1"></div>
<span class="name">{{item.name}}</span> <span class="name">{{item.name}}</span>
@ -114,7 +114,7 @@
<script type="module"> <script type="module">
import { rpc } from "./assets/js/lp.utils.js"; import { rpc } from "./assets/js/lp.utils.js";
import { useDefaultConf } from "./assets/js/vue.hooks.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 vue from "./assets/js/vue.build.js";
import mutationObserver from './assets/plugins/polyfill/mutationobserver.esm.js'; import mutationObserver from './assets/plugins/polyfill/mutationobserver.esm.js';
@ -300,6 +300,7 @@
} }
}) })
app.use(ignoreCustomElementPlugin); app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app') app.mount('#app')
</script> </script>
</body> </body>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,6 +2,7 @@
namespace Link\Ctx; namespace Link\Ctx;
use DOMDocument;
use Link\Basic; use Link\Basic;
class Root extends Basic class Root extends Basic
{ {
@ -132,4 +133,78 @@ class Root extends Basic
exec('/usr/nginx/sbin/nginx -p /usr/nginx -s reload'); exec('/usr/nginx/sbin/nginx -p /usr/nginx -s reload');
return $this->handleRet($param, 'success', '保存成功', 'save successfully'); 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"); $param = file_get_contents("php://input");
if(is_null(json_decode($param))) if(is_null(json_decode($param)))
$param = json_encode($_POST); $param = json_encode($_POST);
$param = json_decode(urldecode($param),true); $param = json_decode($param,true);
try try
{ {

View File

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

View File

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

View File

@ -1,26 +1,26 @@
{ {
"files": { "files": {
"main.css": "./mixer/static/css/main.375af961.chunk.css", "main.css": "./mixer/static/css/main.1be3e506.chunk.css",
"main.js": "./mixer/static/js/main.5f5e49d2.chunk.js", "main.js": "./mixer/static/js/main.6a7a8d48.chunk.js",
"main.js.map": "./mixer/static/js/main.5f5e49d2.chunk.js.map", "main.js.map": "./mixer/static/js/main.6a7a8d48.chunk.js.map",
"runtime-main.js": "./mixer/static/js/runtime-main.c45edf70.js", "runtime-main.js": "./mixer/static/js/runtime-main.c45edf70.js",
"runtime-main.js.map": "./mixer/static/js/runtime-main.c45edf70.js.map", "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/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.edf0bfe8.chunk.js": "./mixer/static/js/2.edf0bfe8.chunk.js",
"static/js/2.f2aad125.chunk.js.map": "./mixer/static/js/2.f2aad125.chunk.js.map", "static/js/2.edf0bfe8.chunk.js.map": "./mixer/static/js/2.edf0bfe8.chunk.js.map",
"index.html": "./mixer/index.html", "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", "service-worker.js": "./mixer/service-worker.js",
"static/css/2.0b7c8b97.chunk.css.map": "./mixer/static/css/2.0b7c8b97.chunk.css.map", "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/css/main.1be3e506.chunk.css.map": "./mixer/static/css/main.1be3e506.chunk.css.map",
"static/js/2.f2aad125.chunk.js.LICENSE.txt": "./mixer/static/js/2.f2aad125.chunk.js.LICENSE.txt", "static/js/2.edf0bfe8.chunk.js.LICENSE.txt": "./mixer/static/js/2.edf0bfe8.chunk.js.LICENSE.txt",
"static/js/main.5f5e49d2.chunk.js.LICENSE.txt": "./mixer/static/js/main.5f5e49d2.chunk.js.LICENSE.txt" "static/js/main.6a7a8d48.chunk.js.LICENSE.txt": "./mixer/static/js/main.6a7a8d48.chunk.js.LICENSE.txt"
}, },
"entrypoints": [ "entrypoints": [
"static/js/runtime-main.c45edf70.js", "static/js/runtime-main.c45edf70.js",
"static/css/2.0b7c8b97.chunk.css", "static/css/2.0b7c8b97.chunk.css",
"static/js/2.f2aad125.chunk.js", "static/js/2.edf0bfe8.chunk.js",
"static/css/main.375af961.chunk.css", "static/css/main.1be3e506.chunk.css",
"static/js/main.5f5e49d2.chunk.js" "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("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
importScripts( importScripts(
"./mixer/precache-manifest.1a06c0869ff880086e3a9be9dac86c16.js" "./mixer/precache-manifest.abb42691e68409f9e64fbfb6933199f3.js"
); );
self.addEventListener('message', (event) => { 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"> <script type="module">
import { rpc,alertMsg } from "./assets/js/lp.utils.js"; import { rpc,alertMsg } from "./assets/js/lp.utils.js";
import { useDefaultConf } from "./assets/js/vue.hooks.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"; import vue from "./assets/js/vue.build.js";
const {createApp,ref,reactive,watchEffect,onMounted,nextTick} = vue; const {createApp,ref,reactive,watchEffect,onMounted,nextTick} = vue;
@ -172,6 +172,7 @@
} }
}); });
app.use(ignoreCustomElementPlugin); app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app'); app.mount('#app');
</script> </script>
</body> </body>

View File

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

View File

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

View File

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

View File

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

View File

@ -5,12 +5,12 @@
<div class="btn-toggle-menu" @click="onToggleMenu"> <div class="btn-toggle-menu" @click="onToggleMenu">
<i class="fa-solid fa-bars"></i> <i class="fa-solid fa-bars"></i>
</div> </div>
<!-- <div class="position-relative search-bar d-lg-block d-none" data-bs-toggle="modal" data-bs-target="#searchModal">--> <div class="position-relative search-bar d-lg-block d-none" @click="onShowSearchModal">
<!-- <input class="form-control form-control-sm rounded-5 px-5" disabled type="search" placeholder="Search">--> <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">--> <span class="position-absolute ms-3 translate-middle-y start-0 top-50">
<!-- <i class="fa fa-search"></i>--> <i class="fa fa-search"></i>
<!-- </span>--> </span>
<!-- </div>--> </div>
<ul class="navbar-nav top-right-menu gap-2"> <ul class="navbar-nav top-right-menu gap-2">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" style="font-size: 20px;"> <a class="nav-link" style="font-size: 20px;">
@ -24,7 +24,7 @@
<i v-else class="fa-regular fa-sun" @click="updateThemeConf('default')"></i> <i v-else class="fa-regular fa-sun" @click="updateThemeConf('default')"></i>
</a> </a>
</li> </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"> <a class="nav-link" style="font-size: 19px;" @click="changeWeb">
<i class="fa-solid fa-arrow-right-arrow-left"></i> <i class="fa-solid fa-arrow-right-arrow-left"></i>
</a> </a>
@ -83,7 +83,7 @@
<li> <li>
<a href="push.php"> <a href="push.php">
<div class="parent-icon"><i class="fa-solid fa-fan"></i></div> <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> </a>
</li> </li>
<li v-if="Object.keys(hardwareConf).length > 0 && hardwareConf.function.videoOut"> <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> <div class="menu-title"><cn>视频混合</cn><en>Video mix</en></div>
</a> </a>
</li> </li>
<li class="menu-label"><cn>其他设置</cn><en>Exte0nd</en></li> <li class="menu-label"><cn>其他设置</cn><en>OTHER</en></li>
<li> <li>
<a href="javascript:;" class="has-arrow"> <a href="javascript:;" class="has-arrow">
<div class="parent-icon"><i class="fa-solid fa-puzzle-piece ms-1 mb-1"></i></div> <div class="parent-icon"><i class="fa-solid fa-puzzle-piece ms-1 mb-1"></i></div>
@ -171,7 +171,7 @@
<li> <li>
<a href="service.php"> <a href="service.php">
<i class="fa-solid fa-cloud"></i> <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> </a>
</li> </li>
</ul> </ul>
@ -185,25 +185,25 @@
<li> <li>
<a href="gb28181.php"> <a href="gb28181.php">
<i class="fa-solid fa-cloud"></i> <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> </a>
</li> </li>
<li> <li>
<a href="roi.php"> <a href="roi.php">
<i class="fa-solid fa-circle-user"></i> <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> </a>
</li> </li>
<li> <li>
<a href="insta360.php"> <a href="insta360.php">
<i class="fa-solid fa-camera"></i> <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> </a>
</li> </li>
<li> <li>
<a href="onvif.php"> <a href="onvif.php">
<i class="fa fa-video-camera"></i> <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> </a>
</li> </li>
<li> <li>
@ -237,20 +237,68 @@
</div> </div>
</div> </div>
</aside> </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> </menu>
</div> </div>
<script src="../assets/plugins/passive/passive.events.min.js"></script>
<script type="module"> <script type="module">
import vue from "../assets/js/vue.build.js"; 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 { useThemeConf,useHardwareConf } from "../assets/js/vue.hooks.js"
import { ignoreCustomElementPlugin,usbOptionComponent } from "../assets/js/vue.helper.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({ const menu = createApp({
components:{ components:{
"usb-option": usbOptionComponent, "usb-option": usbOptionComponent,
"empty-box": emptyBoxFlagComponent
}, },
setup() { setup() {
const { themeConf,updateThemeConf } = useThemeConf(); const { themeConf,updateThemeConf } = useThemeConf();
@ -260,7 +308,12 @@
metismenu: ref(null), metismenu: ref(null),
isMenuToggled : ref(false), isMenuToggled : ref(false),
isSidebarHovered: 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 = () => { 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'); const body = document.querySelector('body');
if(state.isMenuToggled.value) if(state.isMenuToggled.value)
body.classList.add('toggled'); 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(()=>{ onMounted(()=>{
new Metismenu(state.metismenu.value); 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, return {...state,hardwareConf,themeConf,updateThemeConf,onHrefDash,onLogout,onToggleMenu,
onMouseEnter,onMouseLeave,onCloseSidebar,updateSysLanguage,changeWeb} onMouseEnter,onMouseLeave,onCloseSidebar,updateSysLanguage,changeWeb,onShowSearchModal,
onHideSearchModal,onRedirect}
} }
}); });
menu.use(ignoreCustomElementPlugin); menu.use(ignoreCustomElementPlugin);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -70,7 +70,8 @@
<div v-if="Object.keys(hardwareConf).length > 0 && hardwareConf.function.dhcp" class="row mt-3"> <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"> <div class="col-lg-2 offset-lg-1 lp-align-center">
<label> <label>
DHCP <cn>DHCP</cn>
<en>DHCP</en>
</label> </label>
</div> </div>
<div class="col-lg-5"> <div class="col-lg-5">
@ -80,7 +81,8 @@
<div class="row mt-3"> <div class="row mt-3">
<div class="col-lg-2 offset-lg-1 lp-align-center"> <div class="col-lg-2 offset-lg-1 lp-align-center">
<label> <label>
IP <cn>IP</cn>
<en>IP</en>
</label> </label>
</div> </div>
<div class="col-lg-6"> <div class="col-lg-6">
@ -112,7 +114,8 @@
<div class="row mt-3"> <div class="row mt-3">
<div class="col-lg-2 offset-lg-1 lp-align-center"> <div class="col-lg-2 offset-lg-1 lp-align-center">
<label> <label>
DNS <cn>DNS</cn>
<en>DNS</en>
</label> </label>
</div> </div>
<div class="col-lg-6"> <div class="col-lg-6">
@ -122,7 +125,8 @@
<div class="row mt-3"> <div class="row mt-3">
<div class="col-lg-2 offset-lg-1 lp-align-center"> <div class="col-lg-2 offset-lg-1 lp-align-center">
<label> <label>
MAC <cn>MAC</cn>
<en>MAC</en>
</label> </label>
</div> </div>
<div class="col-lg-6"> <div class="col-lg-6">
@ -214,7 +218,8 @@
<div class="row mt-4"> <div class="row mt-4">
<div class="col-lg-3 lp-align-center"> <div class="col-lg-3 lp-align-center">
<label> <label>
DHCP <cn>DHCP</cn>
<en>DHCP</en>
</label> </label>
</div> </div>
<div class="col-lg-8"> <div class="col-lg-8">
@ -224,7 +229,8 @@
<div class="row mt-3"> <div class="row mt-3">
<div class="col-lg-3 lp-align-center"> <div class="col-lg-3 lp-align-center">
<label> <label>
IP <cn>IP</cn>
<en>IP</en>
</label> </label>
</div> </div>
<div class="col-lg-8"> <div class="col-lg-8">
@ -256,7 +262,8 @@
<div class="row mt-3"> <div class="row mt-3">
<div class="col-lg-3 lp-align-center"> <div class="col-lg-3 lp-align-center">
<label> <label>
DNS <cn>DNS</cn>
<en>DNS</en>
</label> </label>
</div> </div>
<div class="col-lg-8"> <div class="col-lg-8">
@ -320,7 +327,8 @@
<div class="row mt-3"> <div class="row mt-3">
<div class="col-lg-2 offset-lg-1 lp-align-center"> <div class="col-lg-2 offset-lg-1 lp-align-center">
<label> <label>
IP <cn>IP</cn>
<en>IP</en>
</label> </label>
</div> </div>
<div class="col-lg-6"> <div class="col-lg-6">
@ -364,7 +372,6 @@
</div> </div>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="row">
<div class="row"> <div class="row">
<div class="col-lg-2 offset-lg-1 lp-align-center"> <div class="col-lg-2 offset-lg-1 lp-align-center">
<label> <label>
@ -374,9 +381,7 @@
</div> </div>
<div class="col-lg-6"> <div class="col-lg-6">
<div class="input-group"> <div class="input-group">
<form>
<input class="form-control" :type="!showPasswd.oldpwd ? 'password' : 'text'" v-model.trim.lazy="userPasswd.oldpwd" autocomplete="off"> <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> <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> </div>
@ -392,9 +397,7 @@
</div> </div>
<div class="col-lg-6"> <div class="col-lg-6">
<div class="input-group"> <div class="input-group">
<form>
<input class="form-control" :type="!showPasswd.newpwd ? 'password' : 'text'" v-model.trim.lazy="userPasswd.newpwd" autocomplete="off"> <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> <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> </div>
@ -408,9 +411,7 @@
</div> </div>
<div class="col-lg-6"> <div class="col-lg-6">
<div class="input-group"> <div class="input-group">
<form>
<input class="form-control" :type="!showPasswd.confirm ? 'password' : 'text'" v-model.trim.lazy="userPasswd.confirm" autocomplete="off"> <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> <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> </div>
@ -423,7 +424,6 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="col-lg-12"> <div class="col-lg-12">
<div class="card"> <div class="card">
<div class="card-header bg-transparent"> <div class="card-header bg-transparent">
@ -977,12 +977,13 @@
<script type="module"> <script type="module">
import vue from "./assets/js/vue.build.js"; 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 { 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 { 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 { 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 { createApp,ref,reactive,watch,watchEffect,computed,onMounted } = vue;
const app = createApp({ const app = createApp({
@ -1217,7 +1218,7 @@
} }
const promiseArray = confs.map((conf) => { 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) Promise.all(promiseArray)
@ -1237,7 +1238,7 @@
saveAs(blob, 'configs.zip'); saveAs(blob, 'configs.zip');
}) })
.catch(error => { .catch(error => {
console.error(error); console.error("下载全部失败");
}); });
} }
@ -1388,6 +1389,7 @@
} }
}); });
app.use(ignoreCustomElementPlugin); app.use(ignoreCustomElementPlugin);
app.use(filterKeywordPlugin);
app.mount('#app'); app.mount('#app');
</script> </script>
</body> </body>

View File

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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.