<template> <div id="home"> <nav class="text-sm font-semibold mb-6" aria-label="Breadcrumb"> <ol class="list-none p-0 inline-flex"> <li class="flex items-center text-blue-500"> <a href="#" class="text-gray-700">My DID</a> <svg class="fill-current w-3 h-3 mx-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path d="M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z"/></svg> </li> <li class="flex items-center"> <a href="#" class="text-gray-600">{{did}} <span v-if="isVerified=='Success'" class="text-green-500 text-l">Verified </span> <span v-if="isVerified=='Failure'" class="text-red-500 text-l">Not Verified</span></a> </li> </ol> </nav> <div class="lg:flex justify-between items-center mb-6"> <p class="text-2xl font-semibold mb-2 lg:mb-0">WAMPAC Blockchain Activities</p> </div> <div class="flex flex-wrap -mx-3 mb-20"> <div class="w-1/2 xl:w-1/4 px-3"> <div class="w-full bg-white border text-blue-400 rounded-lg flex items-center p-6 mb-6 xl:mb-0"> <svg class="w-16 h-16 fill-current mr-4 hidden lg:block" viewBox="0 0 20 20"> <path d="M17.35,2.219h-5.934c-0.115,0-0.225,0.045-0.307,0.128l-8.762,8.762c-0.171,0.168-0.171,0.443,0,0.611l5.933,5.934c0.167,0.171,0.443,0.169,0.612,0l8.762-8.763c0.083-0.083,0.128-0.192,0.128-0.307V2.651C17.781,2.414,17.587,2.219,17.35,2.219M16.916,8.405l-8.332,8.332l-5.321-5.321l8.333-8.332h5.32V8.405z M13.891,4.367c-0.957,0-1.729,0.772-1.729,1.729c0,0.957,0.771,1.729,1.729,1.729s1.729-0.772,1.729-1.729C15.619,5.14,14.848,4.367,13.891,4.367 M14.502,6.708c-0.326,0.326-0.896,0.326-1.223,0c-0.338-0.342-0.338-0.882,0-1.224c0.342-0.337,0.881-0.337,1.223,0C14.84,5.826,14.84,6.366,14.502,6.708"></path> </svg> <div class="text-gray-700"> <p class="font-semibold text-3xl">{{fileSharedCount}}</p> <p>Files Shared</p> </div> </div> </div> <div class="w-1/2 xl:w-1/4 px-3"> <div class="w-full bg-white border text-blue-400 rounded-lg flex items-center p-6 mb-6 xl:mb-0"> <svg class="w-16 h-16 fill-current mr-4 hidden lg:block" viewBox="0 0 20 20"> <path d="M17.684,7.925l-5.131-0.67L10.329,2.57c-0.131-0.275-0.527-0.275-0.658,0L7.447,7.255l-5.131,0.67C2.014,7.964,1.892,8.333,2.113,8.54l3.76,3.568L4.924,17.21c-0.056,0.297,0.261,0.525,0.533,0.379L10,15.109l4.543,2.479c0.273,0.153,0.587-0.089,0.533-0.379l-0.949-5.103l3.76-3.568C18.108,8.333,17.986,7.964,17.684,7.925 M13.481,11.723c-0.089,0.083-0.129,0.205-0.105,0.324l0.848,4.547l-4.047-2.208c-0.055-0.03-0.116-0.045-0.176-0.045s-0.122,0.015-0.176,0.045l-4.047,2.208l0.847-4.547c0.023-0.119-0.016-0.241-0.105-0.324L3.162,8.54L7.74,7.941c0.124-0.016,0.229-0.093,0.282-0.203L10,3.568l1.978,4.17c0.053,0.11,0.158,0.187,0.282,0.203l4.578,0.598L13.481,11.723z"></path> </svg> <div class="text-gray-700"> <p class="font-semibold text-3xl">{{contactsCount}}</p> <p>Contacts</p> </div> </div> </div> <div class="w-1/2 xl:w-1/4 px-3"> <div class="w-full bg-white border text-blue-400 rounded-lg flex items-center p-6"> <svg class="w-16 h-16 fill-current mr-4 hidden lg:block" viewBox="0 0 20 20"> <path d="M14.999,8.543c0,0.229-0.188,0.417-0.416,0.417H5.417C5.187,8.959,5,8.772,5,8.543s0.188-0.417,0.417-0.417h9.167C14.812,8.126,14.999,8.314,14.999,8.543 M12.037,10.213H5.417C5.187,10.213,5,10.4,5,10.63c0,0.229,0.188,0.416,0.417,0.416h6.621c0.229,0,0.416-0.188,0.416-0.416C12.453,10.4,12.266,10.213,12.037,10.213 M14.583,6.046H5.417C5.187,6.046,5,6.233,5,6.463c0,0.229,0.188,0.417,0.417,0.417h9.167c0.229,0,0.416-0.188,0.416-0.417C14.999,6.233,14.812,6.046,14.583,6.046 M17.916,3.542v10c0,0.229-0.188,0.417-0.417,0.417H9.373l-2.829,2.796c-0.117,0.116-0.71,0.297-0.71-0.296v-2.5H2.5c-0.229,0-0.417-0.188-0.417-0.417v-10c0-0.229,0.188-0.417,0.417-0.417h15C17.729,3.126,17.916,3.313,17.916,3.542 M17.083,3.959H2.917v9.167H6.25c0.229,0,0.417,0.187,0.417,0.416v1.919l2.242-2.215c0.079-0.077,0.184-0.12,0.294-0.12h7.881V3.959z"></path> </svg> <div class="text-gray-700"> <p class="font-semibold text-3xl"> {{logsCount}}</p> <p>Logs Sent</p> </div> </div> </div> <div class="w-1/3 xl:w-1/4 px-3"> <!--div class="w-full bg-white border text-blue-400 rounded-lg flex items-center p-6"> <svg class="w-16 h-16 fill-current mr-4 hidden lg:block" viewBox="0 0 20 20"> <path d="M17.431,2.156h-3.715c-0.228,0-0.413,0.186-0.413,0.413v6.973h-2.89V6.687c0-0.229-0.186-0.413-0.413-0.413H6.285c-0.228,0-0.413,0.184-0.413,0.413v6.388H2.569c-0.227,0-0.413,0.187-0.413,0.413v3.942c0,0.228,0.186,0.413,0.413,0.413h14.862c0.228,0,0.413-0.186,0.413-0.413V2.569C17.844,2.342,17.658,2.156,17.431,2.156 M5.872,17.019h-2.89v-3.117h2.89V17.019zM9.587,17.019h-2.89V7.1h2.89V17.019z M13.303,17.019h-2.89v-6.651h2.89V17.019z M17.019,17.019h-2.891V2.982h2.891V17.019z"></path> </svg> <div class="text-gray-700"> <p class="font-semibold text-3xl">{{systemStatus}}</p> <p>Latest Log Status</p> </div> </div--> </div> </div> <div class="flex flex-wrap -mx-3"> <div class="w-full xl:w-1/2 px-3"> <p class="text-xl font-semibold mb-4">Anomaly</p> <div class="w-full bg-white border rounded-lg p-4"> <div class="w-full bg-gray-100 border rounded-lg flex justify-between items-center px-1 py-2"> <canvas id="chart" width="600" height="400"></canvas> </div> </div> </div> <div class="w-full xl:w-1/2 px-3"> <p class="text-xl font-semibold mb-4">Anomaly History</p> <div class="w-full bg-white border rounded-lg p-4"> <div class="w-full bg-gray-100 border rounded-lg flex justify-between items-center px-1 py-2"> <div> <ul> <li v-for="anomaly in anomaly" :key="anomaly"> <div class="did font-semibold text-lg">{{ anomaly.anomaly }} > <span class="text-black-500 font-normal text-sm">{{anomaly.timestamp}}</span></div> <hr> </li> </ul> </div> </div> </div> <br> <p class="text-xl font-semibold mb-4">Contacts online ({{onlinePeersCount}} / {{contactsCount}})</p> <div class="w-full bg-white border rounded-lg p-4"> <div class="w-full bg-gray-100 border rounded-lg flex justify-between items-center px-1 py-2"> <div> <ul> <li v-for="user in onlinePeers" :key="user"> <div class="did text-sm"> {{ user.did }} <span v-if=" user.onlineStatus == 'online' " class="text-green-500">●</span></div> <hr> </li> </ul> </div> </div> </div> </div> </div> </div> </template> <script> import Chart from 'chart.js' import Vue from 'vue' import axios from 'axios' import VModal from 'vue-js-modal' Vue.use(VModal, { dynamicDefaults: { draggable: true, resizable: true, height: 'auto' } }) function formatBytes(bytes, decimals = 0) { if (bytes === 0) return '0 Bytes'; const k = 1024; const dm = decimals < 0 ? 0 : decimals; const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; } export default { name: 'DashboardHome', data() { return { chart: null, isVerified:"", myRole:"", balanceToken: 0, did: "Loading .. ", systemStatus: '', fileSharedCount:0, contactsCount:'Loading..', onlinePeersCount:0, onlinePeers:[], anomaly:[], anomalyChart:[], logsCount: 0, } }, methods:{ checkStatus: function () { console.log("loading DID exists") axios.get('http://localhost:1898/checkDidExists') .then((response) => { console.log(response); if(response.data.data.payload == 'Failure'){ console.log("moving to create DID") this.$router.push({path: '/create-new-DID'}) return; } else { console.log("loading DID verified") axios.get('http://localhost:1898/checkDidVerified') .then((response) => { this.isVerified = response.data.data.payload console.log(response); if(response.data.data.payload == 'Failure'){ console.log("moving to create DID [check]") this.$router.push({path: '/verification'}) return; } else { this.getAnomalies() this.logCount() this.anomalyChartData() this.systemLogStatus() this.checkRole() this.contactsOnline() this.getDashboardData() this.filesShared() this.changeGraph(4) } }) .catch(function (error) { console.log(error); this.$router.push({path: '/verification'}) return; }); } }) .catch(function (error) { console.log(error); this.$router.push({path: '/create-new-DID'}) return; }); }, logCount: function () { console.log("loading logCount") axios.get('http://localhost:1898/getLogsCount') .then((response) => { console.log(response); console.log("logsCount"); this.logsCount = response.data.data }) .catch(function (error) { console.log(error); }); }, anomalyChartData: function () { console.log("loading anomalyChartData") axios.get('http://localhost:1898/anomalyBarChart') .then((response) => { console.log("ANOMALY CHART") this.anomalyChart = response.data.data.payload this.chart = new Chart(document.getElementById("chart").getContext("2d"),{ type: 'bar', data:{ labels : this.anomalyChart.map(i=>i.time), datasets: [{ label: 'Anomalies Recorded Per Day', backgroundColor : "rgba(99,179,237,0.4)", barPercentage: 1, barThickness: 30, maxBarThickness: 60, minBarLength: 5, data : this.anomalyChart.map(i=>i.count), }], } }) }) .catch(function (error) { console.log(error); }); }, getAnomalies: function () { console.log("loading logCount") axios.get('http://localhost:1898/getLatestAnomalies') .then((response) => { console.log(response); console.log("logsCount"); this.anomaly = response.data.data }) .catch(function (error) { console.log(error); }); }, systemLogStatus: function () { console.log("loading logCount") axios.get('http://localhost:1898/latestSystemStatus') .then((response) => { console.log(response); console.log("logsCount"); this.systemStatus = response.data.data }) .catch(function (error) { console.log(error); }); }, checkRole: function() { axios.get('http://localhost:1898/checkRole') .then((response) => { if(response.data.data.payload == 'Verifier') { this.$router.push({path: '/dashboard/verifier'}) } }) .catch(function (error) { console.log(error); }); }, getDashboardData: function () { console.log("loading getDashboardData") axios.get('http://localhost:1898/getDashboard') .then((response) => { console.log(response) this.contactsCount = response.data.data.payload.contactsCount this.did = response.data.data.payload.did }) .catch(function (error) { console.log("RESPONSE ERROR CODE") this.$router.push({path: '/create-new-DID'}) console.log(error); }); }, contactsOnline: function () { console.log("loading contactsOnline") axios.get('http://localhost:1898/getOnlinePeers') .then((response) => { console.log(response); this.onlinePeers = response.data.data.payload console.log(this.onlinePeers) }) .catch(function (error) { console.log(error); }); }, filesShared: function () { console.log("loading filesShared") axios.get('http://localhost:1898/getSharedFilesCount') .then((response) => { console.log(response); this.fileSharedCount = response.data.data.response console.log(this.fileSharedCount) }) .catch(function (error) { console.log(error); }); }, fileList: function () { console.log("loading filesShared") axios.get('http://localhost:1898/getSharedFiles') .then((response) => { console.log(response); this.sharedFiles = response.data.data.response console.log(this.sharedFiles) }) .catch(function (error) { console.log(error); }); }, }, beforeMount() { this.checkStatus() }, } </script> <style> .did{ font-size: 10px; } ul{ list-style-type: none; } </style>