即時告警假資料 | webUser顯示登入帳號的名稱 | Display Name的欄位 改成 Mac | 歷史資料:常用組合的按鈕隱藏、TiTle像是UI選項、設備名稱要改 | 能源管理介面修改
This commit is contained in:
parent
dbe0be5cf6
commit
334d0d5212
@ -17,7 +17,7 @@ const ackedAlarm = async (uuid) => {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<ul class="py-6 pr-4 min-h-full text-base-content">
|
<ul class="pr-4 min-h-full text-base-content">
|
||||||
<!-- Sidebar content here -->
|
<!-- Sidebar content here -->
|
||||||
<li class="my-3" v-for="alarm in store.alarmData" :key="alarm.uuid">
|
<li class="my-3" v-for="alarm in store.alarmData" :key="alarm.uuid">
|
||||||
<div
|
<div
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref } from "vue";
|
import { onMounted, ref } from "vue";
|
||||||
import AlarmCards from "./AlarmCards.vue";
|
import AlarmCards from "./AlarmCards.vue";
|
||||||
import { twMerge } from "tailwind-merge";
|
|
||||||
|
|
||||||
const showErr = ref(false);
|
const showErr = ref(false);
|
||||||
const toggleErrIcon = () => {
|
const toggleErrIcon = () => {
|
||||||
@ -36,12 +35,8 @@ const toggleErrIcon = () => {
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
:class="
|
v-if="showErr"
|
||||||
twMerge(
|
class="drawer-side translate-y-20 max-h-[90vh] overflow-x-hidden overflow-y-scroll"
|
||||||
'drawer-side translate-y-20 max-h-[90vh] overflow-x-hidden',
|
|
||||||
showErr ? 'overflow-y-scroll' : ''
|
|
||||||
)
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<AlarmCards />
|
<AlarmCards />
|
||||||
</div>
|
</div>
|
||||||
|
@ -3,7 +3,7 @@ import { onMounted, ref } from "vue";
|
|||||||
import NavbarItem from "./NavbarItem.vue";
|
import NavbarItem from "./NavbarItem.vue";
|
||||||
import NavbarBuilding from "./NavbarBuilding.vue";
|
import NavbarBuilding from "./NavbarBuilding.vue";
|
||||||
import Logo from "@/assets/img/logo.svg";
|
import Logo from "@/assets/img/logo.svg";
|
||||||
import useGetCookie from "@/hooks/useGetCookie";
|
import useUserInfoStore from "@/stores/useUserInfoStore";
|
||||||
import AlarmDrawer from "@/components/alarm/AlarmDrawer.vue";
|
import AlarmDrawer from "@/components/alarm/AlarmDrawer.vue";
|
||||||
import NavbarLang from "./NavbarLang.vue";
|
import NavbarLang from "./NavbarLang.vue";
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from "tailwind-merge";
|
||||||
@ -11,8 +11,9 @@ import { twMerge } from "tailwind-merge";
|
|||||||
const user = ref("");
|
const user = ref("");
|
||||||
const menuShow = ref(true);
|
const menuShow = ref(true);
|
||||||
|
|
||||||
|
const store = useUserInfoStore();
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
const name = useGetCookie("niagara_userid");
|
const name = store.user.user_name;
|
||||||
if (name) {
|
if (name) {
|
||||||
user.value = name;
|
user.value = name;
|
||||||
}
|
}
|
||||||
@ -92,11 +93,12 @@ const src = import.meta.env.MODE === "production" ? "./logo.svg" : Logo;
|
|||||||
class="dropdown-content translate-y-2 z-[100] menu py-3 shadow rounded w-32 bg-[#4c625e] border text-center"
|
class="dropdown-content translate-y-2 z-[100] menu py-3 shadow rounded w-32 bg-[#4c625e] border text-center"
|
||||||
>
|
>
|
||||||
<li class="text-white">
|
<li class="text-white">
|
||||||
<a
|
<router-link
|
||||||
href="/logout"
|
to="logout"
|
||||||
|
type="link"
|
||||||
class="flex flex-col justify-center items-center"
|
class="flex flex-col justify-center items-center"
|
||||||
>{{ $t("sign_out") }}
|
>{{ $t("sign_out") }}
|
||||||
</a>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
"year_elec_consumption": "今年用电度数(kWh)",
|
"year_elec_consumption": "今年用电度数(kWh)",
|
||||||
"interval_elec_consumption": "区间用电度数(kWh)",
|
"interval_elec_consumption": "区间用电度数(kWh)",
|
||||||
"monthly_elec_consumption": "每月用电分析",
|
"monthly_elec_consumption": "每月用电分析",
|
||||||
"monthly_carbon_emission_and_reduction": "每月碳排当量 (kgCO2e) 与减量目标",
|
"monthly_carbon_emission_and_reduction": "每月碳排当量 (kgCO2e)",
|
||||||
"monthly_bill_power": "每月计费度数 (kWh)",
|
"monthly_bill_power": "每月计费度数 (kWh)",
|
||||||
"interval_bill_degree": "区间计费度数"
|
"interval_bill_degree": "区间计费度数"
|
||||||
},
|
},
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
"year_elec_consumption": "今年用電度數(kWh)",
|
"year_elec_consumption": "今年用電度數(kWh)",
|
||||||
"interval_elec_consumption": "區間用電度數(kWh)",
|
"interval_elec_consumption": "區間用電度數(kWh)",
|
||||||
"monthly_elec_consumption": "每月用電分析",
|
"monthly_elec_consumption": "每月用電分析",
|
||||||
"monthly_carbon_emission_and_reduction": "每月碳排當量 (kgCO2e) 與減量目標",
|
"monthly_carbon_emission_and_reduction": "每月碳排當量 (kgCO2e)",
|
||||||
"monthly_bill_power": "每月計費度數 (kWh)",
|
"monthly_bill_power": "每月計費度數 (kWh)",
|
||||||
"interval_bill_degree": "區間計費度數"
|
"interval_bill_degree": "區間計費度數"
|
||||||
},
|
},
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
"year_elec_consumption": "This year's electricity consumption (kWh)",
|
"year_elec_consumption": "This year's electricity consumption (kWh)",
|
||||||
"interval_elec_consumption": "Interval electricity consumption (kWh)",
|
"interval_elec_consumption": "Interval electricity consumption (kWh)",
|
||||||
"monthly_elec_consumption": "Monthly electricity consumption analysis",
|
"monthly_elec_consumption": "Monthly electricity consumption analysis",
|
||||||
"monthly_carbon_emission_and_reduction": "Monthly carbon emission equivalent (kgCO2e) and reduction target",
|
"monthly_carbon_emission_and_reduction": "Monthly carbon emission equivalent (kgCO2e)",
|
||||||
"monthly_bill_power": "Monthly billing power (kWh)",
|
"monthly_bill_power": "Monthly billing power (kWh)",
|
||||||
"interval_bill_degree": "Interval billing degree"
|
"interval_bill_degree": "Interval billing degree"
|
||||||
},
|
},
|
||||||
|
@ -108,6 +108,7 @@ router.beforeEach(async (to, from, next) => {
|
|||||||
if (to.path === "/logout") {
|
if (to.path === "/logout") {
|
||||||
document.cookie = "JWT-Authorization=";
|
document.cookie = "JWT-Authorization=";
|
||||||
auth.user.token = "";
|
auth.user.token = "";
|
||||||
|
window.location.reload();
|
||||||
next({ path: "/login" });
|
next({ path: "/login" });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,77 +13,40 @@ const useAlarmStore = defineStore("alarmData", () => {
|
|||||||
};
|
};
|
||||||
// get data from baja
|
// get data from baja
|
||||||
const getAlarmDataFromBaja = () => {
|
const getAlarmDataFromBaja = () => {
|
||||||
window.require &&
|
const alarms = [];
|
||||||
window.requirejs(["baja!"], (baja) => {
|
const sampleDeviceNames = ["AA", "DeviceB", "DeviceC", "DeviceD"];
|
||||||
let alarms = [];
|
const sampleMsgs = [
|
||||||
baja.Ord.make(
|
"Over temperature",
|
||||||
`local:|foxs:|alarm:|bql:select * where sourceState = 'offnormal' order by timestamp desc`
|
"Power failure",
|
||||||
).get({
|
"Sensor malfunction",
|
||||||
cursor: {
|
"Connection lost",
|
||||||
before: () => {
|
];
|
||||||
timer = null;
|
|
||||||
},
|
|
||||||
each: (record) => {
|
|
||||||
const device_number = record
|
|
||||||
.get("alarmData")
|
|
||||||
.get("sourceName")
|
|
||||||
.split("_")
|
|
||||||
.slice(0, 8)
|
|
||||||
.join("_");
|
|
||||||
// console.log("getAlarm each", {
|
|
||||||
// uuid: record.get("uuid"),
|
|
||||||
// alarmClass: record.get("alarmClass"),
|
|
||||||
// timestamp_date: getFormateDate(
|
|
||||||
// record.get("timestamp").getJsDate(),
|
|
||||||
// "YYYY/MM/DD"
|
|
||||||
// ),
|
|
||||||
// timestamp_time: getFormateDate(
|
|
||||||
// record.get("timestamp").getJsDate(),
|
|
||||||
// "HH:mm:ss"
|
|
||||||
// ),
|
|
||||||
// device_number,
|
|
||||||
// msg: record.get("alarmData").get("msgText"),
|
|
||||||
// sourceState: record.get("sourceState").getDisplayTag(),
|
|
||||||
// normalTime: getFormateDate(
|
|
||||||
// record.get("normalTime").getJsDate()
|
|
||||||
// ),
|
|
||||||
// ackState: record.get("ackState").getDisplayTag(),
|
|
||||||
// ackedTime: getFormateDate(record.get("ackTime").getJsDate()),
|
|
||||||
// });
|
|
||||||
|
|
||||||
alarms.push({
|
for (let i = 0; i < 3; i++) {
|
||||||
uuid: record.get("uuid"),
|
const timestamp = Date.now() - Math.floor(Math.random() * 100000000);
|
||||||
timestamp_date: getFormateDate(
|
|
||||||
record.get("timestamp").getJsDate(),
|
const device_number = `NTPC_F1_Dust_EM_U9F_NA_AD_AA${Math.floor(Math.random() * 5) + 1}`;
|
||||||
"YYYY/MM/DD "
|
|
||||||
),
|
alarms.push({
|
||||||
timestamp_time: getFormateDate(
|
uuid: `uuid-${i+1}`,
|
||||||
record.get("timestamp").getJsDate(),
|
building_tag: "U9F",
|
||||||
"HH:mm:ss"
|
timestamp_date: new Date(timestamp).toLocaleDateString("en-US"),
|
||||||
),
|
timestamp_time: new Date(timestamp).toLocaleTimeString("en-US"),
|
||||||
alarmClass: record.get("alarmClass"),
|
alarmClass: `Class ${Math.floor(Math.random() * 3) + 1}`,
|
||||||
device_number,
|
device_number,
|
||||||
full_name: allDeviceList.value.find(
|
full_name: `AA${Math.floor(Math.random() * 5) + 1}`,
|
||||||
(d) => device_number === d.device_number
|
msg: sampleMsgs[Math.floor(Math.random() * sampleMsgs.length)],
|
||||||
)?.full_name,
|
sourceState: "offnormal",
|
||||||
msg: record.get("alarmData").get("msgText"),
|
normalTime: new Date(timestamp).toLocaleString("en-US"),
|
||||||
sourceState: record.get("sourceState").getDisplayTag(),
|
ackState: "Unacked",
|
||||||
normalTime: getFormateDate(
|
ackedTime:
|
||||||
record.get("normalTime").getJsDate()
|
Math.random() > 0.5
|
||||||
),
|
? new Date(timestamp).toLocaleString("en-US")
|
||||||
ackState: record.get("ackState").getDisplayTag(),
|
: null,
|
||||||
ackedTime: getFormateDate(record.get("ackTime").getJsDate()),
|
|
||||||
});
|
|
||||||
},
|
|
||||||
after: () => {
|
|
||||||
alarmData.value = alarms;
|
|
||||||
timer = setTimeout(() => {
|
|
||||||
getAlarmDataFromBaja();
|
|
||||||
}, 2000);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
alarmData.value = alarms;
|
||||||
};
|
};
|
||||||
|
|
||||||
const getDevice = async () => {
|
const getDevice = async () => {
|
||||||
|
@ -109,7 +109,7 @@ const openCompanyAddModal = () => {
|
|||||||
></Input
|
></Input
|
||||||
>
|
>
|
||||||
<Input :value="formState" width="270" name="operate_text">
|
<Input :value="formState" width="270" name="operate_text">
|
||||||
<template #topLeft>{{ $t("assetManagement.operate_text") }}</template>
|
<template #topLeft>Mac</template>
|
||||||
<template #bottomLeft
|
<template #bottomLeft
|
||||||
><span class="text-error text-base">
|
><span class="text-error text-base">
|
||||||
{{ formErrorMsg.operate_text }}
|
{{ formErrorMsg.operate_text }}
|
||||||
|
@ -186,7 +186,7 @@ const onCancel = () => {
|
|||||||
:getCoordinate="getCoordinate"
|
:getCoordinate="getCoordinate"
|
||||||
:class="
|
:class="
|
||||||
twMerge(
|
twMerge(
|
||||||
'absolute top-0 left-0',
|
'absolute top-0 left-0 bg-white',
|
||||||
currentFloor?.floor_map_url ? 'opacity-1' : 'opacity-0'
|
currentFloor?.floor_map_url ? 'opacity-1' : 'opacity-0'
|
||||||
)
|
)
|
||||||
"
|
"
|
||||||
|
@ -49,7 +49,7 @@ const activeTab = computed(() => {
|
|||||||
<ButtonGroup
|
<ButtonGroup
|
||||||
:items="items"
|
:items="items"
|
||||||
:withLine="true"
|
:withLine="true"
|
||||||
class="mt-8 mb-6"
|
class="my-6"
|
||||||
:onclick="changeComponent"
|
:onclick="changeComponent"
|
||||||
/>
|
/>
|
||||||
<component :is="activeTab.component"></component>
|
<component :is="activeTab.component"></component>
|
||||||
|
@ -51,7 +51,7 @@ const activeTitle = computed(() => {
|
|||||||
<ButtonGroup
|
<ButtonGroup
|
||||||
:items="items"
|
:items="items"
|
||||||
:withLine="true"
|
:withLine="true"
|
||||||
class="mt-8 mb-6"
|
class="my-6"
|
||||||
:onclick="changeComponent"
|
:onclick="changeComponent"
|
||||||
/>
|
/>
|
||||||
<component :is="activeTab.component"></component>
|
<component :is="activeTab.component"></component>
|
||||||
|
@ -13,6 +13,8 @@ import {
|
|||||||
} from "@/apis/operation";
|
} from "@/apis/operation";
|
||||||
import { getAccountUserList } from "@/apis/account";
|
import { getAccountUserList } from "@/apis/account";
|
||||||
import useBuildingStore from "@/stores/useBuildingStore";
|
import useBuildingStore from "@/stores/useBuildingStore";
|
||||||
|
import useAlarmStore from "@/stores/useAlarmStore";
|
||||||
|
const storeAlarm = useAlarmStore();
|
||||||
|
|
||||||
const { searchParams } = useSearchParam();
|
const { searchParams } = useSearchParam();
|
||||||
const { getAlarmByBaja, alarmData } = useAlarmData();
|
const { getAlarmByBaja, alarmData } = useAlarmData();
|
||||||
@ -93,6 +95,10 @@ const updateDataSource = (data) => {
|
|||||||
const search = async () => {
|
const search = async () => {
|
||||||
tableLoading.value = true;
|
tableLoading.value = true;
|
||||||
if (Object.keys(searchParams.value).length !== 0) {
|
if (Object.keys(searchParams.value).length !== 0) {
|
||||||
|
storeAlarm.getAlarmDataFromBaja();
|
||||||
|
updateDataSource(storeAlarm.alarmData);
|
||||||
|
tableLoading.value = false;
|
||||||
|
/*
|
||||||
await getAlarmByBaja(
|
await getAlarmByBaja(
|
||||||
searchParams.value.start_created_at,
|
searchParams.value.start_created_at,
|
||||||
searchParams.value.end_created_at,
|
searchParams.value.end_created_at,
|
||||||
@ -127,6 +133,7 @@ const search = async () => {
|
|||||||
tableLoading.value = false;
|
tableLoading.value = false;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -258,7 +258,7 @@ const closeModal = () => {
|
|||||||
class="btn btn-outline-success"
|
class="btn btn-outline-success"
|
||||||
@click.prevent="onOk"
|
@click.prevent="onOk"
|
||||||
>
|
>
|
||||||
{{ $t("buttton.submit") }}
|
{{ $t("button.submit") }}
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
@ -10,7 +10,7 @@ const defaultChartOption = ref({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
legend: {
|
legend: {
|
||||||
data: ["Carbon Equivalent", "Reduction Target"],
|
data: ["Carbon Equivalent"],
|
||||||
textStyle: {
|
textStyle: {
|
||||||
color: "#ffffff",
|
color: "#ffffff",
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
@ -62,18 +62,7 @@ const defaultChartOption = ref({
|
|||||||
itemStyle: {
|
itemStyle: {
|
||||||
color: "#45f4ef",
|
color: "#45f4ef",
|
||||||
},
|
},
|
||||||
},
|
}
|
||||||
{
|
|
||||||
name: "Reduction Target",
|
|
||||||
type: "bar",
|
|
||||||
data: [
|
|
||||||
5000, 6000, 6000, 7000, 9500, 9000, 10000, 11000, 10000, 7200, 6000,
|
|
||||||
5000,
|
|
||||||
],
|
|
||||||
itemStyle: {
|
|
||||||
color: "#ffd345",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -16,26 +16,27 @@ const chartOption = {
|
|||||||
nodeWidth: 20,
|
nodeWidth: 20,
|
||||||
nodeGap: 10,
|
nodeGap: 10,
|
||||||
data: [
|
data: [
|
||||||
{ name: "總電錢", value: 100 },
|
{ name: "Total", value: 100 },
|
||||||
{ name: "空調系統", value: 40 },
|
{ name: "HVAC System", value: 40 },
|
||||||
{ name: "照明系統", value: 25 },
|
{ name: "Lighting System", value: 25 },
|
||||||
{ name: "電梯系統", value: 15 },
|
{ name: "Elevator System", value: 15 },
|
||||||
{ name: "插座", value: 10 },
|
{ name: "Outlets", value: 10 },
|
||||||
{ name: "其他", value: 10 },
|
{ name: "Others", value: 10 },
|
||||||
],
|
],
|
||||||
links: [
|
links: [
|
||||||
{ source: "總電錢", target: "空調系統", value: 40 },
|
{ source: "Total", target: "HVAC System", value: 40 },
|
||||||
{ source: "總電錢", target: "照明系統", value: 25 },
|
{ source: "Total", target: "Lighting System", value: 25 },
|
||||||
{ source: "總電錢", target: "電梯系統", value: 15 },
|
{ source: "Total", target: "Elevator System", value: 15 },
|
||||||
{ source: "總電錢", target: "插座", value: 10 },
|
{ source: "Total", target: "Outlets", value: 10 },
|
||||||
{ source: "總電錢", target: "其他", value: 10 },
|
{ source: "Total", target: "Others", value: 10 },
|
||||||
],
|
],
|
||||||
emphasis: {
|
emphasis: {
|
||||||
focus: "adjacency",
|
focus: "adjacency",
|
||||||
},
|
},
|
||||||
label: {
|
label: {
|
||||||
position: "right",
|
position: "right",
|
||||||
fontSize: 12,
|
fontSize: 14,
|
||||||
|
color: "#fff",
|
||||||
},
|
},
|
||||||
itemStyle: {
|
itemStyle: {
|
||||||
borderWidth: 0,
|
borderWidth: 0,
|
||||||
|
@ -134,14 +134,9 @@ onBeforeMount(() => {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="flex flex-col custom-border p-4 mb-4">
|
<div class="flex flex-col custom-border p-4 mb-4">
|
||||||
<HistoryFavoriteOption class="mb-4" />
|
<!-- <HistoryFavoriteOption class="mb-4" />-->
|
||||||
<div class="flex mb-4">
|
<div class="flex items-center gap-4 mb-4">
|
||||||
<button
|
<h2 class="text-lg font-bold ps-2">{{ $t("history.device_category") }} :</h2>
|
||||||
:disabled="true"
|
|
||||||
class="btn btn-outline-success disabled:text-opacity-100 mr-4 my-1"
|
|
||||||
>
|
|
||||||
{{ $t("history.device_category") }}
|
|
||||||
</button>
|
|
||||||
<ButtonGroup
|
<ButtonGroup
|
||||||
:items="sysTagItems"
|
:items="sysTagItems"
|
||||||
:withLine="true"
|
:withLine="true"
|
||||||
@ -152,13 +147,8 @@ onBeforeMount(() => {
|
|||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex mb-4">
|
<div class="flex items-center gap-4 mb-4">
|
||||||
<button
|
<h2 class="text-lg font-bold ps-2">{{ $t("history.point") }} :</h2>
|
||||||
:disabled="true"
|
|
||||||
class="btn btn-outline-success text-white disabled:text-opacity-100 mr-4 my-1"
|
|
||||||
>
|
|
||||||
{{ $t("history.point") }}
|
|
||||||
</button>
|
|
||||||
<ButtonGroup
|
<ButtonGroup
|
||||||
v-if="searchParams?.Device_list"
|
v-if="searchParams?.Device_list"
|
||||||
:items="points"
|
:items="points"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref, watch } from "vue";
|
import { onMounted, ref, watch, inject } from "vue";
|
||||||
import { Login } from "@/apis/login";
|
import { Login } from "@/apis/login";
|
||||||
import Image from "@/assets/img/logo.svg";
|
import Image from "@/assets/img/logo.svg";
|
||||||
import * as yup from "yup";
|
import * as yup from "yup";
|
||||||
@ -8,6 +8,7 @@ import { useRouter } from "vue-router";
|
|||||||
import useUserInfoStore from "@/stores/useUserInfoStore";
|
import useUserInfoStore from "@/stores/useUserInfoStore";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
const { openToast } = inject("app_toast");
|
||||||
const store = useUserInfoStore();
|
const store = useUserInfoStore();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
@ -35,6 +36,8 @@ const doLogin = async () => {
|
|||||||
if (res.isSuccess) {
|
if (res.isSuccess) {
|
||||||
store.user = res.data;
|
store.user = res.data;
|
||||||
router.replace({ path: "/dashboard" });
|
router.replace({ path: "/dashboard" });
|
||||||
|
} else {
|
||||||
|
openToast("error", res.msg);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
Loading…
Reference in New Issue
Block a user