[Frontend] 修改系統監控為下拉選單 | 系統監控側邊選單改固定且為小類|校園總覽及電表塗改為滿版

This commit is contained in:
Celeste 2023-08-21 17:37:26 +08:00
parent 6e3bf25510
commit 8eed17987b
8 changed files with 3960 additions and 4060 deletions

File diff suppressed because it is too large Load Diff

View File

@ -15,53 +15,41 @@
<div class="col-sm-12 col-xl-4"> <div class="col-sm-12 col-xl-4">
<div class="row"> <div class="row">
<div class="col-sm-6 col-xl-6"> <div class="col-sm-6 col-xl-6">
<div <div class="p-3 bg-primary-300 rounded overflow-hidden position-relative text-white mb-g">
class="p-3 bg-primary-300 rounded overflow-hidden position-relative text-white mb-g"
>
<div class=""> <div class="">
<h3 class="display-4 d-block l-h-n m-0 fw-500"> <h3 class="display-4 d-block l-h-n m-0 fw-500">
<span id="todayUseElec">--</span> <span id="todayUseElec">--</span>
<small class="m-0 l-h-n">今日用電量 kWH</small> <small class="m-0 l-h-n">今日用電量 kWH</small>
</h3> </h3>
</div> </div>
<i <i class="fal fa-user position-absolute pos-right pos-bottom opacity-15 mb-n1 mr-n1"
class="fal fa-user position-absolute pos-right pos-bottom opacity-15 mb-n1 mr-n1" style="font-size: 6rem"></i>
style="font-size: 6rem"
></i>
</div> </div>
</div> </div>
<div class="col-sm-6 col-xl-6"> <div class="col-sm-6 col-xl-6">
<div <div class="p-3 bg-warning-400 rounded overflow-hidden position-relative text-white mb-g">
class="p-3 bg-warning-400 rounded overflow-hidden position-relative text-white mb-g"
>
<div class=""> <div class="">
<h3 class="display-4 d-block l-h-n m-0 fw-500"> <h3 class="display-4 d-block l-h-n m-0 fw-500">
<span id="yesUseElec">--</span> <span id="yesUseElec">--</span>
<small class="m-0 l-h-n">昨日用電量 kWH</small> <small class="m-0 l-h-n">昨日用電量 kWH</small>
</h3> </h3>
</div> </div>
<i <i class="fal fa-gem position-absolute pos-right pos-bottom opacity-15 mb-n1 mr-n4"
class="fal fa-gem position-absolute pos-right pos-bottom opacity-15 mb-n1 mr-n4" style="font-size: 6rem"></i>
style="font-size: 6rem"
></i>
</div> </div>
</div> </div>
<div class="col-lg-12"> <div class="col-lg-12">
<div <div id="panel-2"
id="panel-2" class="panel"
class="panel" data-panel-sortable
data-panel-sortable data-panel-collapsed
data-panel-collapsed data-panel-close>
data-panel-close
>
<div class="panel-hdr"> <div class="panel-hdr">
<h2>昨日/今日用電比較 (kWh)</h2> <h2>昨日/今日用電比較 (kWh)</h2>
</div> </div>
<div class="panel-container show"> <div class="panel-container show">
<div class="panel-content poisition-relative"> <div class="panel-content poisition-relative">
<div <div class="p-1 position-absolute pos-right pos-top mt-3 mr-3 z-index-cloud d-flex align-items-center justify-content-center">
class="p-1 position-absolute pos-right pos-top mt-3 mr-3 z-index-cloud d-flex align-items-center justify-content-center"
>
<!--<div class="border-faded border-top-0 border-left-0 border-bottom-0 py-2 pr-4 mr-3 hidden-sm-down"> <!--<div class="border-faded border-top-0 border-left-0 border-bottom-0 py-2 pr-4 mr-3 hidden-sm-down">
<div class="text-right fw-500 l-h-n d-flex flex-column"> <div class="text-right fw-500 l-h-n d-flex flex-column">
<div class="h3 m-0 d-flex align-items-center justify-content-end"> <div class="h3 m-0 d-flex align-items-center justify-content-end">
@ -93,45 +81,35 @@
<div class="col-sm-12 col-xl-4"> <div class="col-sm-12 col-xl-4">
<div class="row"> <div class="row">
<div class="col-sm-6 col-xl-6"> <div class="col-sm-6 col-xl-6">
<div <div class="p-3 bg-success-200 rounded overflow-hidden position-relative text-white mb-g">
class="p-3 bg-success-200 rounded overflow-hidden position-relative text-white mb-g"
>
<div class=""> <div class="">
<h3 class="display-4 d-block l-h-n m-0 fw-500"> <h3 class="display-4 d-block l-h-n m-0 fw-500">
<span id="insPower">--</span> <span id="insPower">--</span>
<small class="m-0 l-h-n">即時功率 kW</small> <small class="m-0 l-h-n">即時功率 kW</small>
</h3> </h3>
</div> </div>
<i <i class="fal fa-lightbulb position-absolute pos-right pos-bottom opacity-15 mb-n5 mr-n6"
class="fal fa-lightbulb position-absolute pos-right pos-bottom opacity-15 mb-n5 mr-n6" style="font-size: 8rem"></i>
style="font-size: 8rem"
></i>
</div> </div>
</div> </div>
<div class="col-sm-6 col-xl-6"> <div class="col-sm-6 col-xl-6">
<div <div class="p-3 bg-info-200 rounded overflow-hidden position-relative text-white mb-g">
class="p-3 bg-info-200 rounded overflow-hidden position-relative text-white mb-g"
>
<div class=""> <div class="">
<h3 class="display-4 d-block l-h-n m-0 fw-500"> <h3 class="display-4 d-block l-h-n m-0 fw-500">
<span id="insPowerPer">--</span> <span id="insPowerPer">--</span>
<small class="m-0 l-h-n">即時契約容量占比 %</small> <small class="m-0 l-h-n">即時契約容量占比 %</small>
</h3> </h3>
</div> </div>
<i <i class="fal fa-globe position-absolute pos-right pos-bottom opacity-15 mb-n1 mr-n4"
class="fal fa-globe position-absolute pos-right pos-bottom opacity-15 mb-n1 mr-n4" style="font-size: 6rem"></i>
style="font-size: 6rem"
></i>
</div> </div>
</div> </div>
<div class="col-lg-12"> <div class="col-lg-12">
<div <div id="panel-3"
id="panel-3" class="panel"
class="panel" data-panel-sortable
data-panel-sortable data-panel-collapsed
data-panel-collapsed data-panel-close>
data-panel-close
>
<div class="panel-hdr"> <div class="panel-hdr">
<h2>本週/上週用電比較 (kWh)</h2> <h2>本週/上週用電比較 (kWh)</h2>
</div> </div>
@ -204,16 +182,12 @@
</div> </div>
<div class="panel-container h-100 show"> <div class="panel-container h-100 show">
<div class="panel-content poisition-relative p-0 row p-0 h-100"> <div class="panel-content poisition-relative p-0 row p-0 h-100">
<div <div class="col-12 mb-2 position-relative row m-0 justify-content-center"
class="col-12 mb-2 position-relative row m-0 justify-content-center" style="max-height: 150px">
style="max-height: 150px"
>
<canvas class="chart" id="errRecChart"></canvas> <canvas class="chart" id="errRecChart"></canvas>
</div> </div>
<div <div class="col-12 mb-2 position-relative row m-0 justify-content-center"
class="col-12 mb-2 position-relative row m-0 justify-content-center" style="max-height: 150px">
style="max-height: 150px"
>
<canvas class="chart" id="errChkChart"></canvas> <canvas class="chart" id="errChkChart"></canvas>
</div> </div>
</div> </div>
@ -227,16 +201,12 @@
</div> </div>
<div class="panel-container h-100 show"> <div class="panel-container h-100 show">
<div class="panel-content poisition-relative row p-0 h-100 p-0"> <div class="panel-content poisition-relative row p-0 h-100 p-0">
<div <div class="col-12 mb-2 position-relative row m-0 justify-content-center"
class="col-12 mb-2 position-relative row m-0 justify-content-center" style="max-height: 150px">
style="max-height: 150px"
>
<canvas class="chart" id="worOrdErrChart"></canvas> <canvas class="chart" id="worOrdErrChart"></canvas>
</div> </div>
<div <div class="col-12 mb-2 position-relative row m-0 justify-content-center"
class="col-12 mb-2 position-relative row m-0 justify-content-center" style="max-height: 150px">
style="max-height: 150px"
>
<canvas class="chart" id="worOrdFinChart"></canvas> <canvas class="chart" id="worOrdFinChart"></canvas>
</div> </div>
</div> </div>
@ -267,8 +237,6 @@
}; };
var contractCapacity = 0; var contractCapacity = 0;
$(document).ready(function () { $(document).ready(function () {
$(loadEle).Loading("start"); $(loadEle).Loading("start");
$(loadEle).Loading("close"); $(loadEle).Loading("close");
@ -292,10 +260,10 @@
(x) => x.mainSys == obj.mainSys && x.subSys == obj.subSys (x) => x.mainSys == obj.mainSys && x.subSys == obj.subSys
)[0]; )[0];
strHtml = `<div class="btn-group btn-group-lg col-lg-6 mb-4 dev-group"> strHtml = `<div class="btn-group btn-group-lg col-lg-6 mb-4 dev-group">
<button name="topFunBtn" data-page="alert" type="button" class="btn btn-secondary col-4 d-flex jusity-content-center"> <button name="topFunBtn" data-page="alert" type="button" class="btn btn-secondary col-4 d-flex jusity-content-center disabled" disabled>
<img src="${iconObj.iconClass}" class="w-100"></img> <img src="${iconObj.iconClass}" class="w-100"></img>
</button> </button>
<button id="sysSubCardBtn${obj.subSys}" type="button" class="btn btn-secondary" data-id="${obj.subSys}" style="font-size: 20px">${obj.text}</button> <button id="sysSubCardBtn${obj.subSys}" type="button" class="btn btn-secondary disabled" disabled data-id="${obj.subSys}" style="font-size: 20px">${obj.text}</button>
</div>`; </div>`;
$("#sysSubBtnList").append(strHtml); $("#sysSubBtnList").append(strHtml);
} }
@ -331,10 +299,10 @@
x.subSys == subSysObj.sub_system_tag x.subSys == subSysObj.sub_system_tag
)[0]?.iconClass; )[0]?.iconClass;
strHtml += `<div class="btn-group btn-group-lg col-lg-6 mb-4 dev-group" data-id="/${pageAct.AreaTag}/${pageAct.buiTag}/${mainSysObj.main_system_tag}/${subSysObj.sub_system_tag}"> strHtml += `<div class="btn-group btn-group-lg col-lg-6 mb-4 dev-group" data-id="/${pageAct.AreaTag}/${pageAct.buiTag}/${mainSysObj.main_system_tag}/${subSysObj.sub_system_tag}">
<button name="topFunBtn" data-page="alert" type="button" class="btn btn-secondary col-4"> <button name="topFunBtn" data-page="alert" type="button" class="btn btn-secondary col-4" >
<img src="${iconClass}" class="w-100 "></img> <img src="${iconClass}" class="w-100 "></img>
</button> </button>
<button id="sysSubCardBtn${subSysObj.sub_system_tag}" type="button" class="btn btn-secondary" data-id="${subSysObj.sub_system_tag}" style="font-size: 20px">${subSysObj.full_name}</button> <button id="sysSubCardBtn${subSysObj.sub_system_tag}" type="button" class="btn btn-secondary" data-id="${subSysObj.sub_system_tag}" style="font-size: 20px">${subSysObj.full_name}</button>
</div>`; </div>`;
}); });
}); });
@ -349,7 +317,7 @@
// 取得 自動須量 // 取得 自動須量
function getAutDemVal() { function getAutDemVal() {
let url = baseApiUrl + "/api/Dashboard/GetContractValue"; let url = baseApiUrl + "/api/Dashboard/GetContractValue";
let sendData = pageAct.buiTag let sendData = pageAct.buiTag;
objSendData.Data = sendData; objSendData.Data = sendData;
ytAjax = new YourTeam.Ajax( ytAjax = new YourTeam.Ajax(
url, url,
@ -358,7 +326,7 @@
if (!res || res.code != "0000" || !res.data) { if (!res || res.code != "0000" || !res.data) {
} else { } else {
contractCapacity = (res.data || [])[0]?.contract_value ?? 0; contractCapacity = (res.data || [])[0]?.contract_value ?? 0;
getFirstEletric() getFirstEletric();
} }
}, },
null, null,
@ -432,18 +400,12 @@
"T00:00:00"; "T00:00:00";
// 今日用電量 // 今日用電量
getElectricMeterDayDataByBaja( getElectricMeterDayDataByBaja(devNum, n4Sup, today, tomorrow, (data) => {
devNum, let result = data?.data[0]?.sum;
n4Sup, result = result ? parseFloat(result).toFixed(2) : 0;
today, $("#todayUseElec").text(result);
tomorrow, chkBajaLoaded();
(data) => { });
let result = data?.data[0]?.sum;
result = result ? parseFloat(result).toFixed(2) : 0;
$("#todayUseElec").text(result);
chkBajaLoaded();
}
);
// 今日用電量 (每小時) // 今日用電量 (每小時)
getElectricMeterHourDataByBaja( getElectricMeterHourDataByBaja(
@ -470,18 +432,12 @@
); );
// 昨日用電量 // 昨日用電量
getElectricMeterDayDataByBaja( getElectricMeterDayDataByBaja(devNum, n4Sup, yesterday, today, (data) => {
devNum, let result = data?.data[0]?.sum;
n4Sup, result = result ? parseFloat(result).toFixed(2) : 0;
yesterday, $("#yesUseElec").text(result);
today, chkBajaLoaded();
(data) => { });
let result = data?.data[0]?.sum;
result = result ? parseFloat(result).toFixed(2) : 0;
$("#yesUseElec").text(result);
chkBajaLoaded();
}
);
// 本週與上週用電量 (每天) // 本週與上週用電量 (每天)
getElectricMeterDayDataByBaja( getElectricMeterDayDataByBaja(
@ -499,9 +455,9 @@
let prevWeekData = data.data.filter( let prevWeekData = data.data.filter(
(x) => (x) =>
strToDate(displayDate(new Date(), "date"), null, 1 - 14) <= strToDate(displayDate(new Date(), "date"), null, 1 - 14) <=
strToDate(x.timestamp.$cEncStr) && strToDate(x.timestamp.$cEncStr) &&
strToDate(new Date(), null, 1 - 7) >= strToDate(new Date(), null, 1 - 7) >=
strToDate(x.timestamp.$cEncStr) strToDate(x.timestamp.$cEncStr)
); );
chartEveWeeksElec(curWeekData, prevWeekData); chartEveWeeksElec(curWeekData, prevWeekData);
@ -511,7 +467,7 @@
// 異常數量與復歸數量 // 異常數量與復歸數量
getAlarmCountByBaja((aData) => { getAlarmCountByBaja((aData) => {
console.log("aData",aData) console.log("aData", aData);
chartDataCnt.alarmCnt = aData; chartDataCnt.alarmCnt = aData;
chkBajaLoaded(); chkBajaLoaded();
}); });
@ -988,7 +944,7 @@
} }
function show3DModel() { function show3DModel() {
if(typeof launchViewerNoTools != "undefined"){ if (typeof launchViewerNoTools != "undefined") {
launchViewerNoTools( launchViewerNoTools(
pageAct.urn, pageAct.urn,
(viewer) => { (viewer) => {
@ -1024,6 +980,10 @@
onEvent("click", "button[id^=sysSubCardBtn]", function () { onEvent("click", "button[id^=sysSubCardBtn]", function () {
let subSysTag = $(this).data("id"); let subSysTag = $(this).data("id");
$(`#subSysBtn${subSysTag}[data-building-tag='${buildingTagOnJquery(pageAct.buiTag)}']`).click(); $(
`#subSysBtn${subSysTag}[data-building-tag='${buildingTagOnJquery(
pageAct.buiTag
)}']`
).click();
}); });
</script> </script>

View File

@ -1,9 +1,9 @@
 
<div class="container-fluid"> <div class="container-fluid">
<div class="row bg-dark align-items-center"> <div class="row bg-dark align-items-center">
<label id="sysSubText" class=" mx-5 mb-0 fs-1-05"></label> <label id="sysSubText" class=" mx-5 mb-0 fs-1-05"></label>
<div style="height:85vh" class="col-12 p-0"> <div style="height:91vh" class="col-12 p-0">
<iframe src="/ord?file:^px/AllMeter.px|view:?fullScreen=true" width="100%" height="100%" style="zoom:0.1"></iframe> <iframe id="homeIframe" src="/ord?file:^px/AllMeter.px|view:?fullScreen=true" width="100%" height="100%" style="zoom:0.1"></iframe>
</div>
</div> </div>
</div>
</div> </div>

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,11 @@
 <style></style>
<div class="container-fluid"> <div class="container-fluid">
<div class="row bg-dark align-items-center"> <div class="row bg-dark align-items-center">
<label id="sysSubText" class=" mx-5 mb-0 fs-1-05"></label> <label id="sysSubText" class="mx-5 mb-0 fs-1-05"></label>
<div style="height:85vh" class="col-12"> <div style="height: 90vh" class="col-12">
<iframe src="/ord?file:^px/Home.px|view:?fullScreen=true" width="100%" height="100%"></iframe> <iframe src="/ord?file:^px/Home.px|view:?fullScreen=true"
</div> width="100%"
height="100%"></iframe>
</div> </div>
</div>
</div> </div>

View File

@ -1,65 +1,79 @@
 <div class="container-fluid px-0">
<div class="container-fluid"> <div class="row no-gutters" style="min-height: 90vh;">
<div class="row bg-dark align-items-center"> <div class="col-1">
<label id="sysSubText" class=" mx-5 mb-0 fs-1-05"></label> <aside id="sysMonNavbar" class="w-100 yt-navbar yt-left-navbar h-100 mt-0">
<div class="btn-group my-1" id="floList"> <div class="yt-navbar-content">
<ul id="sysMonBtnList"></ul>
</div> </div>
</aside>
</div> </div>
<div class="col-11">
<div class="container-fluid">
<div class="row bg-dark align-items-center">
<label id="sysSubText" class="mx-5 mb-0 fs-1-05"></label>
<div class="btn-group my-1" id="floList"></div>
</div>
</div>
<main id="js-page-content" role="main" class="page-content"></main>
</div>
</div>
</div> </div>
<main id="js-page-content" role="main" class="page-content">
</main>
<script> <script>
var floList = []; var floList = [];
$(function () { $(function () {
$("#sysSubText").text(pageAct.buiName +"/"+pageAct.sysSubName); $("#sysSubText").text(pageAct.buiName + "/" + pageAct.sysSubName);
getFloList(); getSysMonBtnList();
}) getFloList();
});
onEvent("yt:tab:change", "[name=floBtn]", function () { onEvent("yt:tab:change", "[name=floBtn]", function () {
$.each(tolSubList, (idx, sub) => { $.each(tolSubList, (idx, sub) => {
sub.unsubscribeAll(); sub.unsubscribeAll();
sub.detach(); sub.detach();
}) });
tolSubList=[]; tolSubList = [];
pageAct.floTag = $(this).data("id"); pageAct.floTag = $(this).data("id");
pageAct.floGuid = $(this).data("guid"); pageAct.floGuid = $(this).data("guid");
if ($(this).data("id") == "all") { if ($(this).data("id") == "all") {
pageAct.floTag = null; pageAct.floTag = null;
pageAct.floGuid = null; pageAct.floGuid = null;
$("#js-page-content").load("_sysMonAll.html", loadCallback); $("#js-page-content").load("_sysMonAll.html", loadCallback);
} else { } else {
$("#js-page-content").load("_sysMonFloor.html", loadCallback); $("#js-page-content").load("_sysMonFloor.html", loadCallback);
}
})
onEvent("change", "#buiList", function (e, actEle) {
getFloList();
})
function getFloList() {
let url = baseApiUrl + "/api/Device/GetFloor";
let sendData = { building_tag: pageAct.buiTag, sub_system_tag: pageAct.sysSubTag };
objSendData.Data = sendData;
ytAjax = new YourTeam.Ajax(url, objSendData, function (res) {
if (!res || res.code != "0000" || !res.data) {
} else {
let strHtml = `<button name="floBtn" data-id="all" type="button" class="btn btn-secondary waves-effect waves-themed btn-sm-2" data-tabname="floor" data-target="all">總覽</button>`;
$.each(res.data, (index, floObj) => {
strHtml += `<button name="floBtn" data-id="${floObj.floor_tag}" data-guid="${floObj.floor_guid}" class="btn btn-secondary waves-effect waves-themed btn-sm-2" data-tabname="floor" data-target="${floObj.floor_tag}">${floObj.floor_tag}</button>`;
})
$("#floList").html(strHtml);
floList = res.data;
var ytTab = new YT.Tab({ tabName: "floor" })
}
}, null, "POST").send();
} }
});
onEvent("change", "#buiList", function (e, actEle) {
getFloList();
});
function getFloList() {
let url = baseApiUrl + "/api/Device/GetFloor";
let sendData = {
building_tag: pageAct.buiTag,
sub_system_tag: pageAct.sysSubTag,
};
objSendData.Data = sendData;
ytAjax = new YourTeam.Ajax(
url,
objSendData,
function (res) {
if (!res || res.code != "0000" || !res.data) {
} else {
let strHtml = `<button name="floBtn" data-id="all" type="button" class="btn btn-secondary waves-effect waves-themed btn-sm-2" data-tabname="floor" data-target="all">總覽</button>`;
$.each(res.data, (index, floObj) => {
strHtml += `<button name="floBtn" data-id="${floObj.floor_tag}" data-guid="${floObj.floor_guid}" class="btn btn-secondary waves-effect waves-themed btn-sm-2" data-tabname="floor" data-target="${floObj.floor_tag}">${floObj.floor_tag}</button>`;
});
$("#floList").html(strHtml);
floList = res.data;
var ytTab = new YT.Tab({ tabName: "floor" });
}
},
null,
"POST"
).send();
}
</script> </script>

File diff suppressed because it is too large Load Diff

View File

@ -95,7 +95,10 @@ function setDropdownItem(menuEle) {
let actText = $(menuEle).find(".dropdown-item.active").first().text(); let actText = $(menuEle).find(".dropdown-item.active").first().text();
let actEleId = $(menuEle).prop("id"); let actEleId = $(menuEle).prop("id");
$(`.dropdown-toggle[data-target=${actEleId}]`).text(actText); if (actEleId) {
$(`.dropdown-toggle[data-target=${actEleId}]`).text(actText);
}
/*actChaCallback($(menuEle).find(".dropdown-item.active"))*/ /*actChaCallback($(menuEle).find(".dropdown-item.active"))*/
$(menuEle).trigger("active:change", $(menuEle).find(".dropdown-item.active")); $(menuEle).trigger("active:change", $(menuEle).find(".dropdown-item.active"));
@ -1248,42 +1251,62 @@ class Forge3DSensor {
} }
} }
function setTopBuildingText(){ function setTopBuildingText() {
$(".top-building-text-container").load("_topBuildingText.html",function(){ $(".top-building-text-container").load("_topBuildingText.html", function () {
}) })
} }
function buildingTagOnJquery(building_tag){ function buildingTagOnJquery(building_tag) {
let frontSyntax = building_tag.slice(0,2); let frontSyntax = building_tag.slice(0, 2);
if(frontSyntax == "$3"){ if (frontSyntax == "$3") {
return building_tag.slice(2,building_tag.length); return building_tag.slice(2, building_tag.length);
} }
return building_tag; return building_tag;
} }
function buildingTagOnProcess(building_tag){ function buildingTagOnProcess(building_tag) {
if(!isNaN(parseInt(building_tag.slice(0,1)))){ if (!isNaN(parseInt(building_tag.slice(0, 1)))) {
building_tag = "$3" + building_tag; building_tag = "$3" + building_tag;
} }
return building_tag; return building_tag;
} }
function deviceNumber(devNum){ function deviceNumber(devNum) {
if(devNum.includes("$3")){ if (devNum.includes("$3")) {
devNum = devNum.replaceAll("$3",""); devNum = devNum.replaceAll("$3", "");
} }
return devNum; return devNum;
} }
function deviceNumberOnProcess(devNum){ function deviceNumberOnProcess(devNum) {
if(devNum.includes("/")){ if (devNum.includes("/")) {
tags = devNum.split("/"); tags = devNum.split("/");
buildingTag = tags[1]; buildingTag = tags[1];
buildingTag = buildingTagOnProcess(buildingTag); buildingTag = buildingTagOnProcess(buildingTag);
devNum = tags[0] + "/" + buildingTag + "/" + tags.slice(2,tags.length).join("/") devNum = tags[0] + "/" + buildingTag + "/" + tags.slice(2, tags.length).join("/")
} }
return devNum; return devNum;
} }
function convertToBase64(imagePath, callback) {
// 創建一個新的 FileReader 物件
const reader = new FileReader();
// 當 FileReader 讀取完成時的處理函數
reader.onloadend = () => {
if (typeof callback === 'function') {
// 從 result 中獲取 base64 編碼的圖像數據
const base64String = reader.result.split(',')[1];
callback(base64String);
}
};
// 讀取圖像文件
fetch(imagePath)
.then((response) => response.blob())
.then((blob) => reader.readAsDataURL(blob))
.catch((error) => console.error('Error:', error));
}