Merge branch 'master' of https://gitea.mjm-staging.developers-homelab.net/BIMS/BIMS
This commit is contained in:
commit
64a86b841c
252
Frontend/_sysMonAll.html
Normal file
252
Frontend/_sysMonAll.html
Normal file
@ -0,0 +1,252 @@
|
||||
<style>
|
||||
[id^=yt_tooltip] {
|
||||
width: 450px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-xl-5">
|
||||
<div class="d-flex justify-content-start mb-6">
|
||||
<button type="button" class="btn btn-primary waves-effect waves-themed mr-5">19 F</button>
|
||||
<div id="floor19" class="mr-5 cur-poi">
|
||||
<span class="status status-success d-inline-block">
|
||||
<img src="img/demo/avatars/avatar-c.png" class="profile-image rounded-circle" alt="...">
|
||||
</span> 19F 門口東
|
||||
</div>
|
||||
<div class="mr-5">
|
||||
<span class="status status-danger d-inline-block">
|
||||
<img src="img/demo/avatars/avatar-c.png" class="profile-image rounded-circle" alt="...">
|
||||
</span> 19F 戶外門口中間
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-start mb-6">
|
||||
<button type="button" class="btn btn-primary waves-effect waves-themed mr-5">21 F</button>
|
||||
<div class=" mr-5">
|
||||
<span class="status status-success d-inline-block">
|
||||
<img src="img/demo/avatars/avatar-c.png" class="profile-image rounded-circle" alt="...">
|
||||
</span> 21F 電錶01
|
||||
</div>
|
||||
<div class="mr-5">
|
||||
<span class="status status-danger d-inline-block">
|
||||
<img src="img/demo/avatars/avatar-c.png" class="profile-image rounded-circle" alt="...">
|
||||
</span> 21F 電錶02
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="col-sm-12 col-xl-7">
|
||||
<img src="img/clouds.png" class="img-fluid" style="min-height: 520px;">
|
||||
<!--<a href="javascript:;" data-toggle="modal" data-target=".default-example-modal-right-lg">
|
||||
<span class="badge border border-light bg-primary-700 position-absolute pos-top pos-left"><i class="fal fa-image fa-3x"></i></span></a>-->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
$(function () {
|
||||
initPopover();
|
||||
})
|
||||
|
||||
function drawStateTabBlo() {
|
||||
let strHtml = `<table class="table table-bordered table-striped text-center m-0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>電壓 V</td>
|
||||
<td>113</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>電流 A</td>
|
||||
<td>8</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>功率 W</td>
|
||||
<td>203</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>今日用電 kWh</td>
|
||||
<td>58</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>`
|
||||
return strHtml;
|
||||
}
|
||||
|
||||
function drawInfoTabBlo() {
|
||||
let strHtml = `<table class="table table-bordered table-striped text-center m-0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>設備編號</td>
|
||||
<td>B01-B2-19F-CR-001</td>
|
||||
<td>3D 座標</td>
|
||||
<td>113</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>設備名稱</td>
|
||||
<td>A區迴路001</td>
|
||||
<td>forge dbid</td>
|
||||
<td>101</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>廠牌</td>
|
||||
<td>飛利浦 Philip</td>
|
||||
<td>IP</td>
|
||||
<td>192.168.1.105</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>型號</td>
|
||||
<td>BH065</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>原廠文件</td>
|
||||
<td><a href="#">2022使用手冊.pdf</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>型號</td>
|
||||
<td>BH065</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>`
|
||||
return strHtml;
|
||||
}
|
||||
|
||||
function drawErrRecTabBlo() {
|
||||
let strHtml = `<table class="table table-bordered table-striped text-center m-0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>設備編號</td>
|
||||
<td>B01-B2-19F-CR-001</td>
|
||||
<td>3D 座標</td>
|
||||
<td>113</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>設備名稱</td>
|
||||
<td>A區迴路001</td>
|
||||
<td>forge dbid</td>
|
||||
<td>101</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>廠牌</td>
|
||||
<td>飛利浦 Philip</td>
|
||||
<td>IP</td>
|
||||
<td>192.168.1.105</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>型號</td>
|
||||
<td>BH065</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>原廠文件</td>
|
||||
<td><a href="#">2022使用手冊.pdf</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>型號</td>
|
||||
<td>BH065</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>`
|
||||
return strHtml;
|
||||
}
|
||||
|
||||
function drawOpeRecTabBlo() {
|
||||
let strHtml = `<table id="opeRecTable" class="table table-bordered table-striped text-center m-0 w-100">
|
||||
|
||||
</table>`
|
||||
return strHtml;
|
||||
}
|
||||
|
||||
function initPopover() {
|
||||
$("#floor19").YTTooltip({
|
||||
html: `<div class="card m-1 border device-wrap">
|
||||
<div class="card-header p-2 px-3">
|
||||
<div id="card-tab" class="row justify-content-end nav nav-tabs" role="tablist">
|
||||
<button type="button" id="state-tab" class="btn btn-icon nav-link active" role="tab" data-tabname="cardTab" data-target="#state"><i class="fa fa-desktop icon"></i></button>
|
||||
<button type="button" id="info-tab" class="btn btn-icon nav-link" role="tab" data-tabname="cardTab" data-target="#info"><i class="fa fa-cog icon"></i></button>
|
||||
<button type="button" id="errRec-tab" class="btn btn-icon nav-link" role="tab" data-tabname="cardTab" data-target="#errRec"><i class="fas fa-exclamation-triangle"></i></button>
|
||||
<button type="button" id="opeRec-tab" class="btn btn-icon nav-link" role="tab" data-tabname="cardTab" data-target="#opeRec"><i class="fa fa-bars icon"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-2 tab-content">
|
||||
|
||||
<div id="state" class="show active" data-tabname="cardTab" data-tabrole="child">
|
||||
${drawStateTabBlo()}
|
||||
</div>
|
||||
<div id="info" data-tabname="cardTab" data-tabrole="child">
|
||||
${drawInfoTabBlo()}
|
||||
</div>
|
||||
<div id="errRec" data-tabname="cardTab" data-tabrole="child">
|
||||
${drawErrRecTabBlo()}
|
||||
</div>
|
||||
<div id="opeRec" data-tabname="cardTab" data-tabrole="child">
|
||||
${drawOpeRecTabBlo()}
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>`,
|
||||
onShow: function () {
|
||||
var tab = new YT.Tab({ tabName: "cardTab" })
|
||||
loadOpeRecTable();
|
||||
}
|
||||
})
|
||||
|
||||
function loadOpeRecTable() {
|
||||
let url = "https://api.npoint.io/31e717774a0f5822cc7b";
|
||||
let tag = "#opeRecTable";
|
||||
|
||||
let column_defs = [
|
||||
{ "targets": [0], "width": "8%", "sortable": true },
|
||||
{ "targets": [1], "width": "8%", "sortable": true },
|
||||
{ "targets": [2], "width": "7%", "sortable": true },
|
||||
{ "targets": [3], "width": "7%", "sortable": true },
|
||||
];
|
||||
|
||||
let columns = [
|
||||
{
|
||||
"title": "異常ID",
|
||||
"data": "errId",
|
||||
},
|
||||
{
|
||||
"title": "異常原因",
|
||||
"data": "errReason",
|
||||
},
|
||||
{
|
||||
"title": "ACK確認",
|
||||
"data": "ackCheck",
|
||||
},
|
||||
{
|
||||
"title": "發生/賦歸時間",
|
||||
"data": "time",
|
||||
},
|
||||
|
||||
];
|
||||
|
||||
let callback = function () {
|
||||
$('#opeRecTable').wrap("<div class='scrolledTable'></div>"); //不採用datatable內建scrollbody,會導致thead跑掉
|
||||
let api = this.api();
|
||||
api.columns.adjust();
|
||||
}
|
||||
|
||||
opeRecTable = new YourTeam.JqDataTables.getTableByAjax(url, tag, null, columns, column_defs, callback, null, null, null, null, null, "tpi");
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
243
Frontend/_sysMonFloor.html
Normal file
243
Frontend/_sysMonFloor.html
Normal file
@ -0,0 +1,243 @@
|
||||
<style>
|
||||
[id^=yt_tooltip] {
|
||||
width: 450px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="row">
|
||||
<div id="floChart"></div>
|
||||
</div>
|
||||
|
||||
|
||||
<script src="lib/echarts.min.js"></script>
|
||||
<script>
|
||||
var floChart = null;
|
||||
|
||||
$(function () {
|
||||
initChart();
|
||||
chartHandler();
|
||||
})
|
||||
|
||||
function initChart() {
|
||||
let chartDom = $("#floChart")[0];
|
||||
floChart = echarts.init(chartDom, null, { width: 'auto' });
|
||||
}
|
||||
|
||||
function getSvg() {
|
||||
"/upload/floor_map/c0de2199-e62b-4f82-b7f7-abacd4e1cd17.svg"
|
||||
}
|
||||
|
||||
function chartHandler() {
|
||||
floChart.clear();
|
||||
$.get(`${baseImgUrl}/upload/floor_map/c0de2199-e62b-4f82-b7f7-abacd4e1cd17.svg`, function (svg) {
|
||||
|
||||
if (svg == undefined || svg == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
echarts.registerMap('floor_svg', { svg: svg });
|
||||
|
||||
option = {
|
||||
// animationDurationUpdate: 1500,
|
||||
tooltip: {
|
||||
formatter: function (params) {
|
||||
if (params.data.device_node_guid != undefined && params.data.device_node_guid != null && params.data.device_node_guid != "") {
|
||||
return `名稱:${params.data.device_node_full_name}<br>
|
||||
Guid:${params.data.device_node_guid}`
|
||||
}
|
||||
else {
|
||||
return `名稱:${params.data.device_full_name}<br>
|
||||
Guid:${params.data.device_guid}`
|
||||
}
|
||||
}
|
||||
},
|
||||
toolbox: { //工具欄
|
||||
show: false
|
||||
},
|
||||
geo: {
|
||||
map: 'floor_svg',
|
||||
roam: true,
|
||||
scaleLimit: { //限制放大縮小倍數
|
||||
max: 32,
|
||||
min: 2.5
|
||||
},
|
||||
layoutSize: '100%',
|
||||
layoutCenter: ['50%', '50%'],
|
||||
zoom: 2.5,
|
||||
silent: true
|
||||
},
|
||||
series: [
|
||||
{ //不管有無被選擇(圓點)
|
||||
type: 'scatter',
|
||||
coordinateSystem: 'geo',
|
||||
geoIndex: 0,
|
||||
symbol: 'circle',
|
||||
symbolSize: 10,
|
||||
symbolOffset: [10, 10],
|
||||
label: {
|
||||
show: false
|
||||
},
|
||||
data: currentData,
|
||||
z: 2
|
||||
},
|
||||
{ //未選擇的設備(icon)
|
||||
type: 'scatter',
|
||||
coordinateSystem: 'geo',
|
||||
geoIndex: 0,
|
||||
symbolSize: 30,
|
||||
label: {
|
||||
formatter: '{b}',
|
||||
position: 'bottom',
|
||||
show: true,
|
||||
backgroundColor: 'orange'
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
fontSize: '20',
|
||||
fontWeight: 'bold',
|
||||
color: 'yellow'
|
||||
}
|
||||
},
|
||||
selectedMode: 'single',
|
||||
data: null,
|
||||
z: 1
|
||||
},
|
||||
{ //被選擇的設備(icon)
|
||||
type: 'effectScatter',
|
||||
coordinateSystem: 'geo',
|
||||
geoIndex: 0,
|
||||
showEffectOn: 'render',
|
||||
symbolSize: 30,
|
||||
label: {
|
||||
formatter: '{b}',
|
||||
position: 'bottom',
|
||||
show: true,
|
||||
backgroundColor: 'orange'
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
fontSize: '20',
|
||||
fontWeight: 'bold',
|
||||
color: 'yellow'
|
||||
}
|
||||
},
|
||||
selectedMode: 'single',
|
||||
data: null,
|
||||
z: 1
|
||||
},
|
||||
{ //編輯模式底下的設備(圓點,只會有一個)
|
||||
type: 'scatter',
|
||||
coordinateSystem: 'geo',
|
||||
geoIndex: 0,
|
||||
symbol: 'circle',
|
||||
symbolSize: 10,
|
||||
symbolOffset: [10, 10],
|
||||
label: {
|
||||
show: false
|
||||
},
|
||||
data: currentData,
|
||||
z: 2
|
||||
},
|
||||
{ //編輯模式底下的設備(icon,只會有一個)
|
||||
type: 'scatter',
|
||||
coordinateSystem: 'geo',
|
||||
geoIndex: 0,
|
||||
symbolSize: 30,
|
||||
label: {
|
||||
formatter: '{b}',
|
||||
position: 'bottom',
|
||||
show: true,
|
||||
backgroundColor: 'orange'
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
fontSize: '20',
|
||||
fontWeight: 'bold',
|
||||
color: 'yellow'
|
||||
}
|
||||
},
|
||||
data: null,
|
||||
z: 1
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
floChart.setOption(option);
|
||||
|
||||
floChart.getZr().on('click', function (params) {
|
||||
console.log("click", params);
|
||||
var pixelPoint = [params.offsetX, params.offsetY];
|
||||
var dataPoint = floChart.convertFromPixel({ geoIndex: 0 }, pixelPoint);
|
||||
console.log(dataPoint);
|
||||
|
||||
if (floor_map_mode == "edit") {
|
||||
|
||||
temp_device_on_floor_map = [{
|
||||
device_guid: selected_temp_device.device_guid,
|
||||
device_full_name: selected_temp_device.device_full_name,
|
||||
device_node_guid: selected_temp_device.device_node_guid ? selected_temp_device.device_node_guid : null,
|
||||
device_node_full_name: selected_temp_device.device_node_full_name ? selected_temp_device.device_node_full_name : null,
|
||||
status: selected_temp_device.status,
|
||||
value: dataPoint
|
||||
}];
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// currentData.push([dataPoint[0], dataPoint[1], 1]);
|
||||
// floChart.setOption(option);
|
||||
});
|
||||
|
||||
floChart.on('selectchanged', function (params) {
|
||||
|
||||
console.log("selectchanged", params);
|
||||
// currentData.push([dataPoint[0], dataPoint[1], 1]);
|
||||
// floChart.setOption(option);
|
||||
|
||||
currentData = $.map(currentData, function (item) {
|
||||
item.selected = false;
|
||||
return item;
|
||||
});
|
||||
|
||||
if (params.selected.length > 0) {
|
||||
currentData[params.selected[0].seriesIndex - 1].selected = true;
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
// floChart.getZr().on('mousewheel', function (params) {
|
||||
// console.log(params)
|
||||
// })
|
||||
floChart.on('georoam', function (params) {
|
||||
|
||||
var zoom = floChart.getOption().geo[0].zoom;
|
||||
|
||||
if (zoom <= 2.5) {
|
||||
ResetFloorMap();
|
||||
floChart.setOption({
|
||||
geo: {
|
||||
roam: 'scale'
|
||||
},
|
||||
});
|
||||
} else {
|
||||
floChart.setOption({
|
||||
geo: {
|
||||
roam: true
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
})
|
||||
.fail(function () {
|
||||
toast_warning("查無該樓層地圖")
|
||||
floChart.clear();
|
||||
});
|
||||
}
|
||||
</script>
|
@ -7,259 +7,32 @@
|
||||
<div class="row bg-dark">
|
||||
<h1 class="p-2 mx-5 mb-0">電錶系統</h1>
|
||||
<div class="btn-group my-2">
|
||||
<button type="button" class="btn btn-secondary waves-effect waves-themed">總覽</button>
|
||||
<button type="button" class="btn btn-secondary waves-effect waves-themed">19 F</button>
|
||||
<button type="button" class="btn btn-secondary waves-effect waves-themed">21 F</button>
|
||||
<button name="floBtn" data-id="all" type="button" class="btn btn-secondary waves-effect waves-themed" data-tabname="floor" data-target="all">總覽</button>
|
||||
<button name="floBtn" data-id="19" class="btn btn-secondary waves-effect waves-themed" data-tabname="floor" data-target="19">19 F</button>
|
||||
<button name="floBtn" data-id="21" class="btn btn-secondary waves-effect waves-themed" data-tabname="floor" data-target="21">21 F</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<main id="js-page-content" role="main" class="page-content">
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-xl-5">
|
||||
<div class="d-flex justify-content-start mb-6">
|
||||
<button type="button" class="btn btn-primary waves-effect waves-themed mr-5">19 F</button>
|
||||
<div id="floor19" class="mr-5">
|
||||
<span class="status status-success d-inline-block">
|
||||
<img src="img/demo/avatars/avatar-c.png" class="profile-image rounded-circle" alt="...">
|
||||
</span> 19F 門口東
|
||||
</div>
|
||||
<div class="mr-5">
|
||||
<span class="status status-danger d-inline-block">
|
||||
<img src="img/demo/avatars/avatar-c.png" class="profile-image rounded-circle" alt="...">
|
||||
</span> 19F 戶外門口中間
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-start mb-6">
|
||||
<button type="button" class="btn btn-primary waves-effect waves-themed mr-5">21 F</button>
|
||||
<div class=" mr-5">
|
||||
<span class="status status-success d-inline-block">
|
||||
<img src="img/demo/avatars/avatar-c.png" class="profile-image rounded-circle" alt="...">
|
||||
</span> 21F 電錶01
|
||||
</div>
|
||||
<div class="mr-5">
|
||||
<span class="status status-danger d-inline-block">
|
||||
<img src="img/demo/avatars/avatar-c.png" class="profile-image rounded-circle" alt="...">
|
||||
</span> 21F 電錶02
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="col-sm-12 col-xl-7">
|
||||
<img src="img/clouds.png" class="img-fluid" style="min-height: 520px;">
|
||||
<!--<a href="javascript:;" data-toggle="modal" data-target=".default-example-modal-right-lg">
|
||||
<span class="badge border border-light bg-primary-700 position-absolute pos-top pos-left"><i class="fal fa-image fa-3x"></i></span></a>-->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</main>
|
||||
|
||||
<script>
|
||||
|
||||
$("#js-page-content").load("_sysMonAll.html",loadCallback);
|
||||
|
||||
$(function () {
|
||||
initPopover();
|
||||
})
|
||||
|
||||
function drawStateTabBlo() {
|
||||
let strHtml = `<table class="table table-bordered table-striped text-center m-0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>電壓 V</td>
|
||||
<td>113</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>電流 A</td>
|
||||
<td>8</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>功率 W</td>
|
||||
<td>203</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>今日用電 kWh</td>
|
||||
<td>58</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>`
|
||||
return strHtml;
|
||||
}
|
||||
|
||||
function drawInfoTabBlo() {
|
||||
let strHtml = `<table class="table table-bordered table-striped text-center m-0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>設備編號</td>
|
||||
<td>B01-B2-19F-CR-001</td>
|
||||
<td>3D 座標</td>
|
||||
<td>113</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>設備名稱</td>
|
||||
<td>A區迴路001</td>
|
||||
<td>forge dbid</td>
|
||||
<td>101</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>廠牌</td>
|
||||
<td>飛利浦 Philip</td>
|
||||
<td>IP</td>
|
||||
<td>192.168.1.105</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>型號</td>
|
||||
<td>BH065</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>原廠文件</td>
|
||||
<td><a href="#">2022使用手冊.pdf</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>型號</td>
|
||||
<td>BH065</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>`
|
||||
return strHtml;
|
||||
}
|
||||
|
||||
function drawErrRecTabBlo() {
|
||||
let strHtml = `<table class="table table-bordered table-striped text-center m-0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>設備編號</td>
|
||||
<td>B01-B2-19F-CR-001</td>
|
||||
<td>3D 座標</td>
|
||||
<td>113</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>設備名稱</td>
|
||||
<td>A區迴路001</td>
|
||||
<td>forge dbid</td>
|
||||
<td>101</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>廠牌</td>
|
||||
<td>飛利浦 Philip</td>
|
||||
<td>IP</td>
|
||||
<td>192.168.1.105</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>型號</td>
|
||||
<td>BH065</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>原廠文件</td>
|
||||
<td><a href="#">2022使用手冊.pdf</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>型號</td>
|
||||
<td>BH065</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>`
|
||||
return strHtml;
|
||||
}
|
||||
|
||||
function drawOpeRecTabBlo() {
|
||||
let strHtml = `<table id="opeRecTable" class="table table-bordered table-striped text-center m-0 w-100">
|
||||
|
||||
</table>`
|
||||
return strHtml;
|
||||
}
|
||||
|
||||
function initPopover() {
|
||||
$("#floor19").YTTooltip({
|
||||
html: `<div class="card m-1 border device-wrap">
|
||||
<div class="card-header p-2 px-3">
|
||||
<div id="card-tab" class="row justify-content-end nav nav-tabs" role="tablist">
|
||||
<button type="button" id="state-tab" class="btn btn-icon nav-link active" role="tab" data-tabname="cardTab" data-target="#state"><i class="fa fa-desktop icon"></i></button>
|
||||
<button type="button" id="info-tab" class="btn btn-icon nav-link" role="tab" data-tabname="cardTab" data-target="#info"><i class="fa fa-cog icon"></i></button>
|
||||
<button type="button" id="errRec-tab" class="btn btn-icon nav-link" role="tab" data-tabname="cardTab" data-target="#errRec"><i class="fas fa-exclamation-triangle"></i></button>
|
||||
<button type="button" id="opeRec-tab" class="btn btn-icon nav-link" role="tab" data-tabname="cardTab" data-target="#opeRec"><i class="fa fa-bars icon"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-2 tab-content">
|
||||
|
||||
<div id="state" class="show active" data-tabname="cardTab" data-tabrole="child">
|
||||
${drawStateTabBlo() }
|
||||
</div>
|
||||
<div id="info" data-tabname="cardTab" data-tabrole="child">
|
||||
${drawInfoTabBlo() }
|
||||
</div>
|
||||
<div id="errRec" data-tabname="cardTab" data-tabrole="child">
|
||||
${drawErrRecTabBlo() }
|
||||
</div>
|
||||
<div id="opeRec" data-tabname="cardTab" data-tabrole="child">
|
||||
${drawOpeRecTabBlo() }
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>`,
|
||||
onShow: function () {
|
||||
|
||||
var tab = new YT.Tab({ tabName: "cardTab" })
|
||||
|
||||
loadOpeRecTable();
|
||||
onEvent("click", "[name=floBtn]", function () {
|
||||
if ($(this).data("id") == "all") {
|
||||
$("#js-page-content").load("_sysMonAll.html", loadCallback);
|
||||
} else {
|
||||
$("#js-page-content").load("_sysMonFloor.html", loadCallback);
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
function loadOpeRecTable() {
|
||||
let url = "https://api.npoint.io/31e717774a0f5822cc7b";
|
||||
let tag = "#opeRecTable";
|
||||
|
||||
let column_defs = [
|
||||
{ "targets": [0], "width": "8%", "sortable": true },
|
||||
{ "targets": [1], "width": "8%", "sortable": true },
|
||||
{ "targets": [2], "width": "7%", "sortable": true},
|
||||
{ "targets": [3], "width": "7%", "sortable": true},
|
||||
];
|
||||
|
||||
let columns = [
|
||||
{
|
||||
"title": "異常ID",
|
||||
"data": "errId",
|
||||
},
|
||||
{
|
||||
"title": "異常原因",
|
||||
"data": "errReason",
|
||||
},
|
||||
{
|
||||
"title": "ACK確認",
|
||||
"data": "ackCheck",
|
||||
},
|
||||
{
|
||||
"title": "發生/賦歸時間",
|
||||
"data": "time",
|
||||
},
|
||||
|
||||
];
|
||||
|
||||
let callback = function () {
|
||||
$('#opeRecTable').wrap("<div class='scrolledTable'></div>"); //不採用datatable內建scrollbody,會導致thead跑掉
|
||||
let api = this.api();
|
||||
api.columns.adjust();
|
||||
}
|
||||
|
||||
opeRecTable = new YourTeam.JqDataTables.getTableByAjax(url, tag, null, columns, column_defs, callback, null, null, null, null, null, "tpi");
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
124
Frontend/css/site.css
Normal file
124
Frontend/css/site.css
Normal file
@ -0,0 +1,124 @@
|
||||
|
||||
.mod-skin-dark:not(.mod-skin-light) .panel-hdr, .mod-skin-dark:not(.mod-skin-light) .card-header {
|
||||
background: rgba(0, 0, 0, 0.03);
|
||||
}
|
||||
|
||||
|
||||
/* ================================================================ */
|
||||
/* 單一方法 */
|
||||
/* ================================================================ */
|
||||
|
||||
:root {
|
||||
--yt-main-gray: #c2c7d0;
|
||||
--yt-main-black: #212529;
|
||||
--yt-main-gray-hover: #c2c7d0;
|
||||
--yt-gray: #505050;
|
||||
--yt-gray-hover: #3c3c3c;
|
||||
--yt-gray-2: #8f8c8c;
|
||||
--yt-gray-2-hover: #646060;
|
||||
--yt-gray-3: #ededed;
|
||||
--yt-gray-4: #dddddd;
|
||||
--yt-pink: #ff95d0;
|
||||
--yt-pink-hover: #ef84c0;
|
||||
--yt-red-2:#d34949;
|
||||
--yt-yellow-1:#ffc902;
|
||||
}
|
||||
|
||||
/* cursor */
|
||||
.cur-def { cursor:default !important;}
|
||||
.cur-poi { cursor:pointer !important;}
|
||||
|
||||
/*left 距離*/
|
||||
.left-05 { left: 0.5rem !important; }
|
||||
.left-04 { left: 0.4rem !important; }
|
||||
.left-03 { left: 0.3rem !important; }
|
||||
.left-02 { left: 0.2rem !important; }
|
||||
.left-01 { left: 0.1rem !important; }
|
||||
|
||||
/*right 距離*/
|
||||
.right-05 { right: 0.5rem !important; }
|
||||
.right-04 { right: 0.4rem !important; }
|
||||
.right-03 { right: 0.3rem !important; }
|
||||
.right-02 { right: 0.2rem !important; }
|
||||
.right-01 { right: 0.1rem !important; }
|
||||
|
||||
/*bottom 0.5rem*/
|
||||
.bm-05 { bottom: 0.5rem !important; }
|
||||
.bm-04 { bottom: 0.4rem !important; }
|
||||
.bm-03 { bottom: 0.3rem !important; }
|
||||
.bm-02 { bottom: 0.2rem !important; }
|
||||
.bm-01 { bottom: 0.1rem !important; }
|
||||
|
||||
/*top 0.5rem*/
|
||||
.tp-05 { top: 0.5rem !important; }
|
||||
.tp-04 { top: 0.4rem !important; }
|
||||
.tp-03 { top: 0.3rem !important; }
|
||||
.tp-02 { top: 0.2rem !important; }
|
||||
.tp-01 { top: 0.1rem !important; }
|
||||
|
||||
/* font-weight */
|
||||
.fw-1 { font-weight: 100; }
|
||||
.fw-2 { font-weight: 200; }
|
||||
.fw-3 { font-weight: 300; }
|
||||
.fw-4 { font-weight: 400; }
|
||||
.fw-5 { font-weight: 500; }
|
||||
.fw-6 { font-weight: 600; }
|
||||
.fw-7 { font-weight: 700; }
|
||||
.fw-8 { font-weight: 800; }
|
||||
.fw-9 { font-weight: 900; }
|
||||
|
||||
/* font-size */
|
||||
.fs-05 { font-size: 0.5rem; }
|
||||
.fs-075 { font-size: 0.75rem; }
|
||||
.fs-09 { font-size: 0.9rem; }
|
||||
.fs-1-05 { font-size: 1.05rem; }
|
||||
.fs-1-1 { font-size: 1.1rem; }
|
||||
.fs-1-2 { font-size: 1.2rem; }
|
||||
.fs-1-3 { font-size: 1.3rem; }
|
||||
.fs-1-5 { font-size: 1.5rem; }
|
||||
.fs-2 { font-size: 2rem; }
|
||||
.fs-2-5 { font-size: 2.5rem; }
|
||||
|
||||
/* border width */
|
||||
.bd-0 { border-width: 0px; }
|
||||
.bd-1 { border-width: 1px; }
|
||||
.bd-2 { border-width: 2px; }
|
||||
|
||||
/* border direction */
|
||||
.bd-l { border-left-style:solid;}
|
||||
.bd-r { border-right-style:solid;}
|
||||
.bd-t { border-top-style:solid;}
|
||||
.bd-b { border-bottom-style:solid;}
|
||||
|
||||
/* border radius */
|
||||
.br-1 { border-radius: 1px; }
|
||||
.br-2 { border-radius: 2px; }
|
||||
.br-3 { border-radius: 3px; }
|
||||
.br-4 { border-radius: 4px; }
|
||||
.br-5 { border-radius: 5px; }
|
||||
|
||||
/* flex-gap */
|
||||
.gap-1 { gap: 1px;}
|
||||
.gap-2 { gap: 2px;}
|
||||
.gap-3 { gap: 3px;}
|
||||
.gap-4 { gap: 4px;}
|
||||
.gap-5 { gap: 5px;}
|
||||
|
||||
/* vertical-align */
|
||||
.va-t {vertical-align: top;}
|
||||
.va-m {vertical-align: middle;}
|
||||
.va-b {vertical-align: bottom;}
|
||||
|
||||
/* text color */
|
||||
.t-main-purple { color: #623c80 !important; }
|
||||
.t-black { color: #000 !important; }
|
||||
.t-white { color:#fff !important;}
|
||||
.t-fb-blue { color: #466ac2 !important; }
|
||||
.t-line-green { color: #54C814 !important; }
|
||||
.t-red { color: #db0000 !important;}
|
||||
.t-red-2 { color:var(--yt-red-2) !important;}
|
||||
.t-gray { color:var(--yt-gray); }
|
||||
.t-main-gray { color: var(--yt-main-gray); }
|
||||
.t-gray-2 { color: var(--yt-gray-2) !important; }
|
||||
.t-gray-3 { color: var(--yt-gray-3); }
|
||||
.t-yellow { color: var(--yt-yellow-1);}
|
@ -32,6 +32,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
||||
<!-- Font Awesome -->
|
||||
<link href="lib/fontawesome-free/css/all.min.css" rel="stylesheet" />
|
||||
<link rel="stylesheet" media="screen, print" href="lib/datagrid/datatables/datatables.bundle.css">
|
||||
<link rel="stylesheet" href="css/site.css" />
|
||||
<link rel="stylesheet" href="css/yourteam/plugins/yt-tooltip/yt-tooltip.css" />
|
||||
</head>
|
||||
<!-- BEGIN Body -->
|
||||
@ -1125,14 +1126,14 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
||||
|
||||
<div class="ml-auto d-flex">
|
||||
<div class="btn-group mx-4">
|
||||
<a href="javascript:;" class="dropdown-toggle no-arrow text-center" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<a href="javascript:;" name="dasBoaBtn" class="text-center">
|
||||
<i class="fal fa-home fa-2x"></i><br>首頁
|
||||
</a>
|
||||
<div class="dropdown-menu">
|
||||
<!--<div class="dropdown-menu">
|
||||
<button class="dropdown-item" type="button">Action</button>
|
||||
<button class="dropdown-item" type="button">Another action</button>
|
||||
<button class="dropdown-item" type="button">Something else here</button>
|
||||
</div>
|
||||
</div>-->
|
||||
</div>
|
||||
<div class="btn-group mx-4">
|
||||
<a href="javascript:;" class="dropdown-toggle no-arrow text-center" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
@ -2063,13 +2064,25 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
||||
<script src="js/main.js"></script>
|
||||
<script src="js/init.js"></script>
|
||||
<script>
|
||||
let user = localStorage.getItem("JWT-Authorization");
|
||||
|
||||
if (user) {
|
||||
$("#app").load("_dashboard.html", loadCallback);
|
||||
} else {
|
||||
location.href = "login.html";
|
||||
}
|
||||
|
||||
$("#app").load("_dashboard.html");
|
||||
|
||||
$("body").on("click", "button[name^=sysMonBtn]", function () {
|
||||
$("#app").load("_systemMonitor.html");
|
||||
onEvent("click", "button[name^=sysMonBtn]", function () {
|
||||
$("#app").load("_systemMonitor.html", loadCallback);
|
||||
})
|
||||
onEvent("click", "button[name=dasBoaBtn]", function () {
|
||||
$("#app").load("_dashboard.html", loadCallback);
|
||||
})
|
||||
|
||||
function loadCallback() {
|
||||
initTabsByEle();
|
||||
resetYTTooltip();
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
<!-- END Body -->
|
||||
|
@ -1,4 +1,6 @@
|
||||
var ytAjax = new YourTeam.Ajax(); //公用AJAX初始化
|
||||
var ytAjax = typeof YourTeam !== "undefined" ? new YourTeam.Ajax() : null; //公用AJAX初始化
|
||||
var baseApiUrl = "http://localhost:3604";
|
||||
var baseImgUrl = "https://localhost:44376";
|
||||
var varRegApiUrl = "/reg/api/"; //註冊API路徑
|
||||
var varApiUrl = "/api/"; //API路徑
|
||||
var varPathImg = "/Upload/Images/";
|
||||
|
@ -1338,6 +1338,10 @@ async function download(url, filename) {
|
||||
|
||||
}
|
||||
|
||||
function onEvent(type,selector,callback) {
|
||||
$("body").on(type, selector, callback)
|
||||
}
|
||||
|
||||
/**
|
||||
* element array sort
|
||||
* @param {any} selector
|
||||
|
@ -12,14 +12,18 @@ var YT = YT || {};
|
||||
|
||||
var _ytTabInited = []
|
||||
$(function () {
|
||||
$("[data-tabname][data-target]:not([data-tabrole='child'])").each(function (index, value) {
|
||||
|
||||
})
|
||||
|
||||
function initTabsByEle() {
|
||||
$("[data-tabname][data-target]:not([data-tabrole=child])").each(function (index, value) {
|
||||
let tabName = $(value).data("tabname");
|
||||
if (_ytTabInited.indexOf(tabName) == -1) {
|
||||
var ytTab = new YTTab({ tabName: tabName })
|
||||
var ytTab = new YT.Tab({ tabName: tabName })
|
||||
_ytTabInited.push(tabName);
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
class YourTeamTab {
|
||||
constructor(option = {}) {
|
||||
@ -28,10 +32,9 @@ class YourTeamTab {
|
||||
}
|
||||
|
||||
init = function() {
|
||||
$(`[data-tabname=${this.tabName}][data-tabrole=child]`).css("display", "none");
|
||||
$(`[data-tabname=${this.tabName}][data-tabrole=child]`).first().show();
|
||||
console.log("inited")
|
||||
this.event();
|
||||
$(`[data-tabname=${this.tabName}][data-tabrole=child]`).css("display", "none");
|
||||
$(`[data-tabname=${this.tabName}][data-target]`).first().click();
|
||||
}
|
||||
|
||||
event = function () {
|
||||
|
@ -117,6 +117,7 @@ $.fn.YTTooltip = function (option) {
|
||||
}, 100)
|
||||
}
|
||||
|
||||
|
||||
eleArr.push(obj);
|
||||
})
|
||||
|
||||
@ -124,3 +125,7 @@ $.fn.YTTooltip = function (option) {
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function resetYTTooltip() {
|
||||
$("[id^=yt_tooltip_]").remove();
|
||||
}
|
45
Frontend/lib/echarts.min.js
vendored
Normal file
45
Frontend/lib/echarts.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -8,13 +8,13 @@
|
||||
<!-- base css -->
|
||||
<link id="vendorsbundle" rel="stylesheet" media="screen, print" href="lib/vendors.bundle.css">
|
||||
<link id="appbundle" rel="stylesheet" media="screen, print" href="lib/app.bundle.css">
|
||||
<link id="mytheme" rel="stylesheet" media="screen, print" href="css/themes/cust-theme-15.css">
|
||||
<link id="myskin" rel="stylesheet" media="screen, print" href="css/skins/skin-master.css">
|
||||
<link id="mytheme" rel="stylesheet" media="screen, print" href="lib/themes/cust-theme-15.css">
|
||||
<link id="myskin" rel="stylesheet" media="screen, print" href="lib/skins/skin-master.css">
|
||||
<!-- Place favicon.ico in the root directory -->
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="img/favicon/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="img/favicon/favicon-32x32.png">
|
||||
<link rel="mask-icon" href="img/favicon/safari-pinned-tab.svg" color="#5bbad5">
|
||||
<link rel="stylesheet" media="screen, print" href="css/page-login-alt.css">
|
||||
<link rel="stylesheet" media="screen, print" href="lib/page-login-alt.css">
|
||||
|
||||
<!-- Font Awesome -->
|
||||
<link href="lib/fontawesome-free/css/all.min.css" rel="stylesheet" />
|
||||
@ -55,7 +55,7 @@
|
||||
<label class="custom-control-label" for="rememberme"> 記住我</label>
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" class="btn btn-default float-right" onclick="Login()">登入</button>
|
||||
<button type="submit" class="btn btn-default float-right" onclick="Login(event)">登入</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="blankpage-footer text-center">
|
||||
@ -78,6 +78,7 @@
|
||||
<script src="lib/notifications/sweetalert2/sweetalert2.bundle.js"></script>
|
||||
<script src="lib/notifications/toastr/toastr.js"></script>
|
||||
<script src="js/toast.js"></script>
|
||||
<script src="js/init.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -127,7 +128,6 @@
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
var baseApiUrl = '@ViewBag.BaseApiUrl';
|
||||
//#region 登入表單驗證
|
||||
var loginValidate = $("#login-form").validate({
|
||||
rules: {
|
||||
@ -160,9 +160,10 @@
|
||||
}, "不可填入空白");
|
||||
//#endregion
|
||||
|
||||
function Login() {
|
||||
function Login(e) {
|
||||
e.preventDefault();
|
||||
if ($("#login-form").valid()) {
|
||||
var url = "http://210.61.91.43:10054/api/Login/";
|
||||
var url = baseApiUrl + "/api/Login/";
|
||||
var send_data = {
|
||||
account: "admin",
|
||||
password: "123456"
|
||||
@ -170,26 +171,28 @@
|
||||
$.ajax({
|
||||
method: "post",
|
||||
url: url,
|
||||
data: send_data,
|
||||
data: JSON.stringify(send_data),
|
||||
async: false,
|
||||
contentType:"application/json; charset=UTF-8",
|
||||
dataType: 'json',
|
||||
success: function (rel) {
|
||||
console.log(rel)
|
||||
|
||||
//rel = JSON.stringify(rel);
|
||||
//if (rel.code != "0000") {
|
||||
// if (rel.code == "9999") {
|
||||
// toast_error(rel.msg);
|
||||
// }
|
||||
// else {
|
||||
// toast_ok(rel.msg);
|
||||
// }
|
||||
// return;
|
||||
//}
|
||||
//else {
|
||||
// localStorage.setItem('JWT-Authorization', rel.data.token);
|
||||
// location.href = "/Home";
|
||||
// return;
|
||||
//}
|
||||
if (rel.code != "0000") {
|
||||
if (rel.code == "9999") {
|
||||
toast_error(rel.msg);
|
||||
}
|
||||
else {
|
||||
toast_ok(rel.msg);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else {
|
||||
localStorage.setItem('JWT-Authorization', rel.data.token);
|
||||
location.href = "index.html";
|
||||
return;
|
||||
}
|
||||
},
|
||||
error: function (xhr, textStatus, thrownError) {
|
||||
alert(textStatus);
|
||||
|
Loading…
Reference in New Issue
Block a user