This commit is contained in:
chenhaodong
2023-07-05 11:06:03 +08:00
parent 8de47479c5
commit 7c55f8da61
234 changed files with 54941 additions and 18 deletions
@@ -0,0 +1,86 @@
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title site-demo-title">
<li class="layui-this add-client-title"></li>
</ul>
<div class="main-content">
<div class="layui-form-item">
<label class="layui-form-label i18n-client-name"></label>
<div class="layui-input-inline">
<input type="text" name="name" autocomplete="off" placeholder="" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label i18n-client-key"></label>
<div class="layui-input-inline">
<input type="text" name="clientKey" autocomplete="off" placeholder="" class="layui-input">
</div>
<div class="layui-form-mid"><a class="layui-btn layui-btn-mini random-key random"></a></div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn add"></button>
</div>
</div>
</div>
</div>
<script>
$(".add-client-title").html($.i18n.prop('client.add'));
$(".i18n-client-name").html($.i18n.prop('client.name'));
$(".i18n-client-key").html($.i18n.prop('client.key'));
$("input[name='name']").attr("placeholder", $.i18n.prop('client.name.placeholder'));
$("input[name='clientKey']").attr("placeholder", $.i18n.prop('client.key.placeholder'));
$(".random").html($.i18n.prop('client.randomkey'));
$(".add").html($.i18n.prop('public.submit'));
$(".random").click(function(){
$("input[name='clientKey']").val(uuid());
});
$(".add").click(function(){
var name = $("input[name='name']").val();
if(name == ""){
layer.alert($.i18n.prop('client.notice.inputname'), {
title: $.i18n.prop('public.tips')
});
return;
}
var clientKey = $("input[name='clientKey']").val();
if(clientKey == ""){
layer.alert($.i18n.prop('client.notice.inputkey'), {
title: $.i18n.prop('public.tips')
});
return;
}
clientList.push({
name:name,
clientKey:clientKey,
proxyMappings:[]
});
api_invoke("/config/update", clientList, function(data) {
if (data.code == 20000) {
layer.alert($.i18n.prop('client.notice.addsuccess'), {title: $.i18n.prop('public.tips')}, function(index){
layer.close(index);
location.reload();
});
}
});
});
$(".back").click(function(){
load_page("html/client/list.html");
});
function uuid() {
var s = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23] = "";
var uuid = s.join("");
return uuid;
}
</script>
@@ -0,0 +1,73 @@
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title site-demo-title">
<li class="layui-this edit-client-title"></li>
</ul>
<div class="main-content">
<div class="layui-form-item">
<label class="layui-form-label i18n-client-name"></label>
<div class="layui-input-inline">
<input type="text" name="name" autocomplete="off" placeholder="" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label i18n-client-key"></label>
<div class="layui-input-inline">
<input type="text" name="clientKey" autocomplete="off" placeholder="" class="layui-input">
</div>
<div class="layui-form-mid"><a class="layui-btn layui-btn-mini random-key random"></a></div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn update"></button>
<button class="layui-btn layui-btn-primary back"></button>
</div>
</div>
</div>
</div>
<script>
$(".edit-client-title").html($.i18n.prop('client.edit'));
$(".i18n-client-name").html($.i18n.prop('client.name'));
$(".i18n-client-key").html($.i18n.prop('client.key'));
$("input[name='name']").attr("placeholder", $.i18n.prop('client.name.placeholder'));
$("input[name='clientKey']").attr("placeholder", $.i18n.prop('client.key.placeholder'));
$(".random").html($.i18n.prop('client.randomkey'));
$(".update").html($.i18n.prop('public.submit'));
$(".back").html($.i18n.prop('public.back'));
$("input[name='name']").val(clientList[clientIndex].name);
$("input[name='clientKey']").val(clientList[clientIndex].clientKey);
$(".random").click(function(){
$("input[name='clientKey']").val(uuid());
});
$(".update").click(function(){
clientList[clientIndex]['name'] = $("input[name='name']").val();
clientList[clientIndex]['clientKey'] = $("input[name='clientKey']").val();
api_invoke("/config/update", clientList, function(data) {
if (data.code == 20000) {
layer.alert($.i18n.prop('public.notice.updatesuccess'), {title: $.i18n.prop('public.tips')}, function(index){
layer.close(index);
location.reload();
});
}
});
});
$(".back").click(function(){
load_page("html/client/list.html");
});
function uuid() {
var s = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23] = "";
var uuid = s.join("");
return uuid;
}
</script>
@@ -0,0 +1,75 @@
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title site-demo-title">
<li class="layui-this detail-page"></li>
</ul>
<div class="main-content"></div>
</div>
<script>
$(".layui-this.detail-page").html($.i18n.prop('client.list'));
window.clientList = [];
api_invoke("/config/detail", {}, function(data) {
if (data.code == 20000) {
clientList = data.data;
var html = template($("#client-tpl").html(), data);
$(".main-content").html(html);
$(".mapping-config").click(function() {
window.clientIndex = $(this).attr("data-index");
load_page("html/lan/list.html");
});
$(".client-edit").click(function() {
window.clientIndex = $(this).attr("data-index");
load_page("html/client/edit.html");
});
$(".client-delete").click(function() {
window.clientIndex = $(this).attr("data-index");
layer.confirm($.i18n.prop('public.confirm.delete'), {
title: $.i18n.prop('public.tips'),
btn : [ $.i18n.prop('public.ok'), $.i18n.prop('public.cancel') ]
}, function(i) {
layer.close(i);
clientList.splice(clientIndex, 1);
api_invoke("/config/update", clientList, function(data) {
if (data.code != 20000) {
layer.alert(data.message);
} else {
location.reload();
}
})
});
});
} else {
alert(data.message);
}
});
</script>
<script id="client-tpl" type="text/html">
<table class="layui-table" lay-skin="line">
<thead>
<tr>
<th class="th-client-name"><%:=$.i18n.prop('client.name')%></th>
<th class="th-client-key"><%:=$.i18n.prop('client.key')%></th>
<th class="th-status"><%:=$.i18n.prop('client.status')%></th>
<th class="th-options"><%:=$.i18n.prop('public.options')%></th>
</tr>
</thead>
<tbody>
<%for(var i = 0; i < data.length; i++) {%>
<tr>
<td><%:=data[i].name%></td>
<td><%:=data[i].clientKey%></td>
<td>
<% if(data[i].status == 1){ %>
<span class="layui-badge layui-bg-green"><%:=$.i18n.prop('client.status.online')%></span>
<% } else { %>
<span class="layui-badge layui-bg-gray"><%:=$.i18n.prop('client.status.offline')%></span>
<% }%>
</td>
<td>
<a data-index="<%:=i%>" class="layui-btn layui-btn-mini client-edit"><%:=$.i18n.prop('public.edit')%></a>
<a data-index="<%:=i%>" class="layui-btn layui-btn-danger layui-btn-mini client-delete"><%:=$.i18n.prop('public.delete')%></a>
</td>
</tr>
<%}%>
</tbody>
</table>
</script>
@@ -0,0 +1,86 @@
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title site-demo-title">
<li class="layui-this i18n-new-proxy"></li>
</ul>
<div class="main-content">
<div class="layui-form-item">
<label class="layui-form-label i18n-lan-name"></label>
<div class="layui-input-block">
<input type="text" name="name" autocomplete="off" placeholder="" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label i18n-lan-inetport"></label>
<div class="layui-input-block">
<input type="text" name="inetPort" autocomplete="off" placeholder="" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label i18n-lan-ip"></label>
<div class="layui-input-block">
<input type="text" name="lan" autocomplete="off" placeholder="" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn add"></button>
<button class="layui-btn layui-btn-primary back"></button>
</div>
</div>
</div>
</div>
<script>
$(".i18n-new-proxy").html($.i18n.prop('lan.addnewconfig'));
$(".i18n-lan-name").html($.i18n.prop('lan.name'));
$(".i18n-lan-inetport").html($.i18n.prop('lan.inetport'));
$(".i18n-lan-ip").html($.i18n.prop('lan.ip'));
$("input[name='inetPort']").attr("placeholder", $.i18n.prop('lan.inetport.placeholder'));
$("input[name='lan']").attr("placeholder", $.i18n.prop('lan.ip.placeholder'));
$(".add").html($.i18n.prop('public.submit'));
$(".back").html($.i18n.prop('public.back'));
$(".add").click(function(){
var name = $("input[name='name']").val();
if(name == ""){
layer.alert($.i18n.prop('lan.notice.inputname'), {title:"Tips"});
return;
}
var inetPort = $("input[name='inetPort']").val();
if(inetPort == ""){
layer.alert($.i18n.prop('lan.notice.inputinetport'), {title:"Tips"});
return;
}
if(!check_port(inetPort)){
layer.alert($.i18n.prop('lan.notice.errorport'), {title:"Tips"});
return;
}
var lan = $("input[name='lan']").val();
if(lan == ""){
layer.alert($.i18n.prop('lan.notice.inputlan'), {title:"Tips"});
return;
}
if(!check_lan(lan)){
layer.alert($.i18n.prop('lan.notice.errorlan'), {title:"Tips"});
return;
}
clientList[clientIndex].proxyMappings.push({
name:name,
inetPort:inetPort,
lan:lan
});
api_invoke("/config/update", clientList, function(data) {
if (data.code == 20000) {
layer.alert($.i18n.prop('public.notice.addsuccess'), {title:"Tips"}, function(index){
layer.close(index);
load_page("html/lan/list.html");
});
}
});
});
$(".back").click(function(){
load_page("html/lan/list.html");
});
</script>
@@ -0,0 +1,91 @@
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title site-demo-title">
<li class="layui-this i18n-lan-title"></li>
</ul>
<div class="main-content">
<div class="layui-form-item">
<label class="layui-form-label i18n-lan-name"></label>
<div class="layui-input-block">
<input type="text" name="name" autocomplete="off" placeholder="" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label i18n-lan-inetport"></label>
<div class="layui-input-block">
<input type="text" name="inetPort" autocomplete="off" placeholder="" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label i18n-lan-ip"></label>
<div class="layui-input-block">
<input type="text" name="lan" autocomplete="off" placeholder="" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn update"></button>
<button class="layui-btn layui-btn-primary back"></button>
</div>
</div>
</div>
</div>
<script>
$(function(){
$("input[name='name']").val(clientList[clientIndex].proxyMappings[mappingIndex].name);
$("input[name='inetPort']").val(clientList[clientIndex].proxyMappings[mappingIndex].inetPort);
$("input[name='lan']").val(clientList[clientIndex].proxyMappings[mappingIndex].lan);
$(".i18n-lan-title").html($.i18n.prop('lan.editconfig'));
$(".i18n-lan-name").html($.i18n.prop('lan.name'));
$(".i18n-lan-inetport").html($.i18n.prop('lan.inetport'));
$(".i18n-lan-ip").html($.i18n.prop('lan.ip'));
$("input[name='inetPort']").attr("placeholder", $.i18n.prop('lan.inetport.placeholder'));
$("input[name='lan']").attr("placeholder", $.i18n.prop('lan.ip.placeholder'));
$(".update").html($.i18n.prop('public.submit'));
$(".back").html($.i18n.prop('public.back'));
});
$(".update").click(function(){
var name = $("input[name='name']").val();
if(name == ""){
layer.alert($.i18n.prop('lan.notice.inputname'), {title:"Tips"});
return;
}
var inetPort = $("input[name='inetPort']").val();
if(inetPort == ""){
layer.alert($.i18n.prop('lan.notice.inputinetport'), {title:"Tips"});
return;
}
if(!check_port(inetPort)){
layer.alert($.i18n.prop('lan.notice.errorport'), {title:"Tips"});
return;
}
var lan = $("input[name='lan']").val();
if(lan == ""){
layer.alert($.i18n.prop('lan.notice.inputlan'), {title:"Tips"});
return;
}
if(!check_lan(lan)){
layer.alert($.i18n.prop('lan.notice.errorlan'), {title:"Tips"});
return;
}
clientList[clientIndex].proxyMappings[mappingIndex]= {
name:name,
inetPort:inetPort,
lan:lan
};
api_invoke("/config/update", clientList, function(data) {
if (data.code == 20000) {
layer.alert($.i18n.prop('public.notice.updatesuccess'), {title:"Tips"}, function(index){
layer.close(index);
load_page("html/lan/list.html");
});
}
});
});
$(".back").click(function(){
load_page("html/lan/list.html");
});
</script>
@@ -0,0 +1,80 @@
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title site-demo-title">
<li class="layui-this tab-title"></li>
</ul>
<div class="main-content"></div>
<div class="layui-input-block" style="float: left; margin-left: 15px;">
<button class="layui-btn mapping-add"></button>
</div>
</div>
<script id="mapping-tpl" type="text/html">
<table class="layui-table" lay-skin="line">
<thead>
<tr>
<th class="i18n-lan-name"></th>
<th class="i18n-lan-inetport"></th>
<th class="i18n-lan-ip"></th>
<th class="i18n-lan-options"></th>
</tr>
</thead>
<tbody>
<%for(var i = 0; i < data.length; i++) {%>
<tr>
<td><%:=data[i].name%></td>
<td><%:=data[i].inetPort%></td>
<td><%:=data[i].lan%></td>
<td>
<a data-index="<%:=i%>" class="layui-btn layui-btn-mini mapping-edit"></a>
<a data-index="<%:=i%>" class="layui-btn layui-btn-danger layui-btn-mini mapping-delete"></a>
</td>
</tr>
<%}%>
</tbody>
</table>
</script>
<script>
$(".tab-title").html(clientList[clientIndex].name + " - " + $.i18n.prop('lan.proxyconfig'));
$(".mapping-add").html($.i18n.prop('lan.addnewconfig'));
var html = template($("#mapping-tpl").html(), {
data : clientList[clientIndex].proxyMappings
});
$(".main-content").html(html);
$(".i18n-lan-name").html($.i18n.prop('lan.name'));
$(".i18n-lan-inetport").html($.i18n.prop('lan.inetport'));
$(".i18n-lan-ip").html($.i18n.prop('lan.ip'));
$(".i18n-lan-options").html($.i18n.prop('public.options'));
$(".mapping-edit").html($.i18n.prop('public.edit'));
$(".mapping-delete").html($.i18n.prop('public.delete'));
$(".mapping-config").click(function() {
window.clientIndex = $(this).attr("data-index");
load_page("html/lan/list.html");
});
$(".mapping-edit").click(function() {
window.mappingIndex = $(this).attr("data-index");
load_page("html/lan/edit.html");
});
$(".mapping-delete").click(function() {
var mappingIndex = $(this).attr("data-index");
layer.confirm($.i18n.prop('public.confirm.delete'), {
title: $.i18n.prop('public.tips'),
btn : [ $.i18n.prop('public.ok'), $.i18n.prop('public.cancel') ]
}, function(i) {
layer.close(i);
clientList[clientIndex].proxyMappings.splice(mappingIndex, 1);
api_invoke("/config/update", clientList, function(data) {
if (data.code != 20000) {
layer.alert(data.message);
} else {
load_page("html/lan/list.html");
}
})
});
});
$(".back").click(function() {
load_page("html/client/list.html");
});
$(".mapping-add").click(function() {
load_page("html/lan/add.html");
});
</script>
@@ -0,0 +1,51 @@
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title site-demo-title">
<li class="layui-this tab-title"></li>
</ul>
<div class="main-content"></div>
</div>
<script id="stat-tpl" type="text/html">
<table class="layui-table" lay-skin="line">
<thead>
<tr>
<th class="i18n-inetport"></th>
<th class="i18n-inflow"></th>
<th class="i18n-outflow"></th>
<th class="i18n-channels"></th>
</tr>
</thead>
<tbody>
<%for(var i = 0; i < data.length; i++) {%>
<tr>
<td><%:=data[i].port%></td>
<td><%:=bytesToSize(data[i].readBytes)%></td>
<td><%:=bytesToSize(data[i].wroteBytes)%></td>
<td><%:=data[i].channels%></td>
</tr>
<%}%>
</tbody>
</table>
</script>
<script>
$(".tab-title").html($.i18n.prop('menu.client.statistics'));
function bytesToSize(bytes) {
if (bytes === 0)
return '0 B';
var k = 1000, // or 1024
sizes = [ 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB' ], i = Math
.floor(Math.log(bytes) / Math.log(k));
return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];
}
api_invoke("/metrics/get", {}, function(data) {
var html = template($("#stat-tpl").html(), {
data : data.data
});
$(".main-content").html(html);
$(".i18n-inetport").html($.i18n.prop('statistics.inetport'));
$(".i18n-inflow").html($.i18n.prop('statistics.inflow'));
$(".i18n-outflow").html($.i18n.prop('statistics.outflow'));
$(".i18n-channels").html($.i18n.prop('statistics.channels'));
});
</script>