From bacfd424833a3953b84d18f4219662d79584070f Mon Sep 17 00:00:00 2001 From: Evangelos Oulis Date: Thu, 23 Jan 2020 01:32:56 +0200 Subject: [PATCH] Update v1.3 --- project.adoc | 40 ++++++++++++++++ project.html | 49 ++++++++++++++++++- serverNode/DB.sql | 8 ++++ serverNode/__pycache__/serv.cpython-37.pyc | Bin 5709 -> 6128 bytes serverNode/serv.py | 53 ++++++++++++--------- webInterface/parking.html | 46 +++++++++--------- 6 files changed, 150 insertions(+), 46 deletions(-) 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 9f5a208f48e145159ae08f7f31ddd9cd1345607f..d42d07a098d022e1205ab2f0e343b033195fa27e 100644 GIT binary patch delta 2063 zcmZ8iO-vg{6rPz~uh#~QjWM<%geBkvCs0VpPea;?`L;r-uvE+f9`)V z7#MGA@)P(x`?c@ZpB)baG0GpFS}SwH^+G5cvZ>v&PqSg$Z-@6OC2J(x3KFpmw6kr~ zgqz%VpK#wk%SO4MH{2)L7;ofFFvfX+H^bP@gFFOd2XEnF7>~hQtvmv6MQqQ$mhA+) zjYq+bD*O0!neZ5ogCnjSUGP9V?*O|)*_Pc_>9#xhu_~iP>Bo8Jk>16RAL$nFQhE!w zHrN+bd}xQ)Pw;NQo=Pu2!F#IgK=0*=D&r>~XcSV{mq_x|<4@@?ly=J-+9P^KKG)Xh zpuDbc&|&#R|BPDls^?!?lW!Xr%U7U)PAis?>dc@9^;47iX(Mf8F)I4Ozk)&h7$9Dd z2@q!sV2zZBOZG{L7U?=IF_%>|POFr&C^^!#C|PACt;i}m*NYma1iGh6O8O^##j-w0 zKCnujBB>Zf5BJ20>xI#XlYPp)U$H6>cX#S0DH2G_Oz)YA_XZN10|~z8vxbI7)DP5i z!y^|i!*6eNDK(dxShh}EQ;XN;t%b40cW2Ynw=+v)(<$rbOlmQ8v+?rj}-TbDVG(`h=MFe3Gpk_L*SjCX&MPCBpBnC7H zBn|NfI{FZj=rumh6?Sb$oJP+XgeZ|u{Y?YSYqp!gg%)yRBfqsa2QjAw;D8f$4ER7+ zEGCBKBjW)R1G3wDwiTyU)789r=SHrO=i-d~(I4(J^Ul1z`H?Md;Z${cfn1ovWI9kB zqdHjPqO5wqFK^>BjR1r)SV(6k4N~zI*hkbO?K+5}{thULcH+_^@KmBMgC<}_wyu?+ z0f1PmNPyQE@ao|#PPn$gL~juq;1bY&w-@--UA+Q)SLte*m5icRF}P7Q>fN#Kt(a8; z&8z|G-n5{wpy&ZuR^;r34x7MA%#0-FM-oeW)3fQN)Z(%=n_j+l#BiPUzQZP%Pc5ew z`;Vf?f6}@!wl$YYEm?gDrytl)CVi^uYg)nHdW~-}g!@obhe4|uE8Cl!c{k}5r@+km za)rX}9bnKAL3|L&$@*4>t!Q;>I>y8~gcn71S z2q}aqfMjERPikH)Nxcqu!(;<1yF%Do?m>r(tLXH)cWhzLI$6`*&ZvT@q6u6|P*o`z z40`ByvMu`9ZF9x?Oyr(h4I=jDq~r*R3N9GBsiYh^r2Vje+5 zP+Pl*+F1l20{(~83~sM%b6dQL9z4VKy}wcu^u0{gcqP>f5Xv?Zj*Kjc3xGgM_0x(@d5ActgKmxb`eEo2Tw9k~D~hc_*!s|?NsON(*v zCaD<4fvFAE3}HLF1^4wOv37rhsDeSCG5LP$@q=E;fd4Oy9rQ{@e%rcE6EYAPqI2?U zWGao9o#+IpX}O&pRimtD1$#FOj(ojI@UKE`MX37X^-=E+>_vf$2~1REA355Z>AM6Wg&}JN`}V#7R@yx+zTyp+J?=kftdCkwhX8^aKRU`;t0woOIs{ zDv~V=xxlFs?N$N_kP?X-#~wLx?4bvKPLETM5ePVd5CBnGvd6hj;Q6OfB;-}eV3G+2peqx`>P&NW6T1R;$JxIHmqJ*5Hh)m>ckv zdSHG4CADDv1CDytK3}?ki@Y=~1(VxgLj*!R0#V5FJjgM1A#{uHb9Fy-E`1W6WEok| zQ}f=a)N4YXQt@yRUQuJ=K^Rwa;ji0o;k*|`#(?84CJ#XZC59}Xj|K|*6_==Jb|hcuGH%* z+ZDOt1?K8by&k}J0P6wNWDcjhEKlotceX{vcQ4aUt7!0!A!FE%5I1!@qTIxCM(`&d zLVJj2LB4=~hoxoebS$dA>HP}E)VtA%G5I{smJON3K}RGfNc!L5#+vJYtiFv-z>JDz z^T|u-^AVEAk>L@SR4MkSHG|5Xd;RfoQ3V z#T2d!?Ds159oJJ2lNtC_{gwRCra0w1C6c;=;%y|4;D$A`OUYo>c_&PB-)k+OqDQ7 zAEik|2Yb&U(>JSoql!Kt{L^%!n$YA3e}uWdO^IcO7Xs+YG(qrHj=(qOHQMDAZh~)$ zDQZ<;(vIC8nmV5#ZcEqOsrz!0W-e0j1uFk9NM0NnA{cQ?c#R@n)vuYM1Bfl*+|T57 z0I?-?KD!R1YA<^h=G6Du+37)?4UEe6cDKlMwu5R-_M+6q9d)J)L%IZ#U@NKRk_sl5 z)M~DzkIShqb4R8q#xy=gQHn-W)J9AgCjKEaUI-=ekA#L3y@}~WJ`s " + val.status); - - if (key > 1) { - chart += "," + val; - } else { - chart += val; - } - + if (val.status == true) + $("div#" + val.no).removeClass("full").addClass("empty"); + else if (val.status == false) + $("div#" + val.no).removeClass("empty").addClass("full"); }); - 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) { },