diff --git a/project.adoc b/project.adoc index e8b6c16..9a8ba1b 100644 --- a/project.adoc +++ b/project.adoc @@ -204,6 +204,10 @@ REST API έτσι ώστε να μπορούν να επικοινωνούν ε * Το όνομα χρήστη (username). * Έναν κωδικό πρόσβασης (password). +Τέλος σε έναν τρίτο πίνακα καταχωρούμε ένα ιστορίκό για την διαθεσιμότητα άρα και για την ζήτηση που έχει το parking. +Ελέγχοντας κάθε φορά που αλλάζει η κατάσταση μίας θέσης του parking, το πλήθος των ελεύθερων θέσεων, το καταχωρούμε +σε αυτόν τον πίνακα σε συνδυασμό με ένα timestamp, εκείνης τις στιγμής. + [source, sql] ---- CREATE TABLE IF NOT EXISTS PARKING ( @@ -217,6 +221,13 @@ CREATE TABLE IF NOT EXISTS USERS ( USER_PASS VARCHAR(40) NOT NULL, PRIMARY KEY(USER_NO) ); + +CREATE TABLE IF NOT EXISTS PARKING_USAGE ( + PARKING_USAGE_NO INT(10) AUTO_INCREMENT, + PARKING_METER INT(10) NOT NULL, + PARKING_DATE DATETIME NOT NULL, + PRIMARY KEY(PARKING_USAGE_NO) +); ---- ==== Υλοποίηση Κόμβου @@ -239,6 +250,32 @@ WEB Server στη Python όπου η εκτέλεση θα πραγματοπο [{"no": 1, "status": false}, {"no": 2, "status": false}, {"no": 3, "status": false}, {"no": 4, "status": true}, {"no": 5, "status": false}, {"no": 6, "status": false}, {"no": 7, "status": false}, {"no": 8, "status": false}] ---- +* /chart [GET]: επιστρέφει ένα array από JSON objects, το καθένα από τα οποία εκφράζουν το πλήθως των ελεύθερων parking και +το αντίστοιχο timestamp της ενημέρωσης. Αυτή η υπηρεσία θα μας βοηθήσει στο να σχεδιάσουμε ένα γράφημα με ματρήσεις ενός 24 ώρου, +της ημέρας. + +[source, json] +---- +[ + { + "usage": 6, + "time": "2020-01-23 01:15:52" + }, + { + "usage": 1, + "time": "2020-01-23 01:22:29" + }, + { + "usage": 0, + "time": "2020-01-23 01:22:33" + }, + { + "usage": 1, + "time": "2020-01-23 01:23:01" + } +] +---- + * /parkingStatus [POST] (content-type = "application/json"): που μας επιτρέπει να αλλάξουμε την κατάσταση μίας θέσης parking. Στο POST τα δεδομένα ορίζονται στο body σε αναπαράσταση JSON, έτσι ώστε ο Server να είναι ικανός να τα επεξεργαστεί και να τα αποθηκεύσει στη βάση δεδομένων που χρησιμοποιούμε. @@ -347,6 +384,9 @@ flask run --host=[IP-v4] --port=8080 Σκοπός αυτής είναι η αναπαράσταση της κατάστασης του Parking σε ένα γραφικό, φιλικό προς τον χρήστη περιβάλλον. Η σελίδα λοιπόν επεικονίζει για κάθε θέση parking με χρώμα κόκκινο την "μη ελεύθεση" και με πράσινο την "ελεύθερη". +Ακόμα, μέσω της υπηρεσία /charts [GET] του REST API, απεικονίσεται ένα διάγραμμα με βάση την διαθεσιμότητα του parking +το τελευταίο 24 ώρο, πιο συσκεκριμένα την τελευταία μέρα. + Ένα παράδειγμα μέσω στιγμιοτύπου παρουσιάζεται παρακάτω. [.float-group] diff --git a/project.html b/project.html index 7fcd114..e79f094 100644 --- a/project.html +++ b/project.html @@ -793,6 +793,11 @@ REST API έτσι ώστε να μπορούν να επικοινωνούν ε +
+

Τέλος σε έναν τρίτο πίνακα καταχωρούμε ένα ιστορίκό για την διαθεσιμότητα άρα και για την ζήτηση που έχει το parking. +Ελέγχοντας κάθε φορά που αλλάζει η κατάσταση μίας θέσης του parking, το πλήθος των ελεύθερων θέσεων, το καταχωρούμε +σε αυτόν τον πίνακα σε συνδυασμό με ένα timestamp, εκείνης τις στιγμής.

+
CREATE TABLE IF NOT EXISTS PARKING (
@@ -805,6 +810,13 @@ CREATE TABLE IF NOT EXISTS USERS (
 	USER_NAME VARCHAR(40) NOT NULL UNIQUE,
 	USER_PASS VARCHAR(40) NOT NULL,
 	PRIMARY KEY(USER_NO)
+);
+
+CREATE TABLE IF NOT EXISTS PARKING_USAGE (
+	PARKING_USAGE_NO INT(10) AUTO_INCREMENT,
+	PARKING_METER INT(10) NOT NULL,
+	PARKING_DATE DATETIME NOT NULL,
+	PRIMARY KEY(PARKING_USAGE_NO)
 );
@@ -841,6 +853,37 @@ WEB Server στη Python όπου η εκτέλεση θα πραγματοπο
+
+
+
+
[
+ {
+    "usage": 6,
+    "time": "2020-01-23 01:15:52"
+  },
+  {
+    "usage": 1,
+    "time": "2020-01-23 01:22:29"
+  },
+  {
+    "usage": 0,
+    "time": "2020-01-23 01:22:33"
+  },
+  {
+    "usage": 1,
+    "time": "2020-01-23 01:23:01"
+  }
+]
+
+
+
+
+

Ακόμα, μέσω της υπηρεσία /charts [GET] του REST API, απεικονίσεται ένα διάγραμμα με βάση την διαθεσιμότητα του parking +το τελευταίο 24 ώρο, πιο συσκεκριμένα την τελευταία μέρα.

+
+

Ένα παράδειγμα μέσω στιγμιοτύπου παρουσιάζεται παρακάτω.

@@ -1190,7 +1237,7 @@ SLOW SUCCESS BUILDS CHARACTER, FAST SUCCESS BUILDS EGO.
diff --git a/serverNode/DB.sql b/serverNode/DB.sql index c5b8235..7b2f7a8 100644 --- a/serverNode/DB.sql +++ b/serverNode/DB.sql @@ -1,5 +1,6 @@ DROP TABLE IF EXISTS PARKING; DROP TABLE IF EXISTS USERS; +DROP TABLE IF EXISTS PARKING_USAGE; CREATE TABLE IF NOT EXISTS PARKING ( PARKING_CODE INT(4) NOT NULL UNIQUE, @@ -13,4 +14,11 @@ CREATE TABLE IF NOT EXISTS USERS ( PRIMARY KEY(USER_NO) ); +CREATE TABLE IF NOT EXISTS PARKING_USAGE ( + PARKING_USAGE_NO INT(10) AUTO_INCREMENT, + PARKING_METER INT(10) NOT NULL, + PARKING_DATE DATETIME NOT NULL, + PRIMARY KEY(PARKING_USAGE_NO) +); + INSERT INTO USERS(USER_NAME, USER_PASS) VALUES("root", "root"); diff --git a/serverNode/__pycache__/serv.cpython-37.pyc b/serverNode/__pycache__/serv.cpython-37.pyc index 9f5a208..d42d07a 100644 Binary files a/serverNode/__pycache__/serv.cpython-37.pyc and b/serverNode/__pycache__/serv.cpython-37.pyc differ diff --git a/serverNode/serv.py b/serverNode/serv.py index 51b65ec..ec6c8ed 100644 --- a/serverNode/serv.py +++ b/serverNode/serv.py @@ -9,6 +9,7 @@ from flask_cors import CORS import mysql.connector from base64 import b64encode from os import urandom +import time # ================================================================== # ================================================================== @@ -69,6 +70,24 @@ def getParkings(): else: parks.append({"no": res[0], "status": False}) return parks + + +# Define function that return the usage of parking from whole day. +def getUsageParking(): + usage = [] + + sql = mySqlConnect() + myCursor = sql.cur + + values = (time.strftime('%Y-%m-%d') + ' 00:00:00', time.strftime('%Y-%m-%d') + ' 23:59:59') + myCursor.execute("SELECT * FROM PARKING_USAGE WHERE PARKING_DATE BETWEEN %s AND %s", values) + myRes = myCursor.fetchall() + + for res in myRes: + usage.append({"usage": res[1], "time": str(res[2])}) + + return usage + # Define a function that get if a user with exiting credencials # username and password is authenticated. @@ -103,24 +122,18 @@ def updateChart(): parks = getParkings() all_parks = len(parks) - full = 0 + mysql = mySqlConnect() + myCursor = mysql.cur + + freeParks = 0 + for park in parks: + if park['status'] == True: + freeParks += 1 - for p in parks: - if p['status'] == False: - full+=1 + values = (freeParks, time.strftime('%Y-%m-%d %H:%M:%S')) + myCursor.execute("INSERT INTO PARKING_USAGE (PARKING_METER, PARKING_DATE) VALUES (%s, %s)", values) + mysql.con.commit() - j = 1 - if len(chart) < 16 : - chart.append(full) - print (chart) - elif len(chart) == 16: - for i in chart: - chart[j] = i - j+=1 - - if j == 16: - break - chart[0] = full return True @@ -234,14 +247,8 @@ class Authenticate(Resource): # Chart class Chart(Resource): def get(self): - result = dict() - - j = 1 - for i in chart: - result[j] = i - j += 1 + result = getUsageParking() - print (result) return result, 200 # ================================================================== diff --git a/webInterface/parking.html b/webInterface/parking.html index 7990e86..533947a 100644 --- a/webInterface/parking.html +++ b/webInterface/parking.html @@ -77,47 +77,49 @@ $(document).ready(function(){ timeout: 120000, }); - jQuery.ajax({ - url: server_protocol + "://" + server_ip + ":" + server_port + "/chart", + + setInterval(function () { + jQuery.ajax({ + url: server_protocol + "://" + server_ip + ":" + server_port + "/", type: "GET", contentType: "application/json; charset=utf-8", success: function(resultData) { - min = 0; - max = all_parks; - chart = ""; - $("div#tab3").html(chart); }, error: function(jqXHR, testStatus, errorThrown) { }, timeout: 120000, }); - setInterval(function () { - jQuery.ajax({ - url: server_protocol + "://" + server_ip + ":" + server_port + "/", + + jQuery.ajax({ + url: server_protocol + "://" + server_ip + ":" + server_port + "/chart", type: "GET", contentType: "application/json; charset=utf-8", success: function(resultData) { + min = 0; + max = all_parks; + chart = ""; + $("div#tab3").html(chart); }, error: function(jqXHR, testStatus, errorThrown) { },