Σκοπός είναι η ανάπτυξη εφαρμογής ηλεκτρονικών δημοπρασιών (bidding platform). Η εφαρμογή αυτή θα υλοποιηθεί βάσει της αρχιτεκτονικής web browser / web server και κάθε χρήστης θα έχει πρόσβαση σε αυτήν μέσω του φυλλομετρητή παγκόσμιου ιστού.
- Maria Karamina
- Georgios Koursiounis
Spring Framework σε IntelliJIDEA (Windows 10)
-
Η σύνδεση κάποιου χρήστη γίνεται με username ή email και password και λαμβάνει ένα JSON Web Token (/auth/login).
-
Ο visitor δεν χρειάζεται token και μπορεί να έχει πρόσβαση μόνο σε συγκεκριμένα μέρη της εφαρμογής.
-
Κάθε User έχει ένα Account στο όποιο κάθε username/email είναι μοναδικό στην εφαρμογή.
-
Ο Administrator είναι επίσης και χρήστης (δηλαδή μπορεί να κάνει sell/bid) πέραν των λειτουργιών που έχει κατά την εκφώνηση.
-
Ο admin μπορεί:
- να δει τους χρήστες προς έγκριση (/admin/pendingRegisters)
- να δει τη λίστα χρηστών (/admin/allUsers)
- να κάνει verify όλους τους εκκρεμείς χρήστες (/admin/verifyAll)
- να κάνει verify έναν μόνο χρήστη (/admin/verifyUser/{userId})
- να δημιουργήσει μια νέα κατηγορία (/admin/newCategory/{categoryId})
- να δει όλες τις δημοπρασίες σε XML η JSON (το front-end δημιουργεί το αρχείο) (/admin/allAuctions)
- να διαγράψει έναν καινούργιο χρήστη αντί να τον κάνει verify (/admin/deleteUser/{userId})
- να δει τις πληροφορίες ενός χρήστη (/user/{username})
-
Ένας χρήστης μπορεί:
- να δει μια δημοπρασία (GET /item/{itemId}). Σε αυτή την περίπτωση καταγράφουμε την επισκεψή του
- να δει όλες τις διαθέσιμες δημοπρασίες (/item/openAuctions)
- να κάνει bid (/bid/makeBid/{itemId})
- να δημιουργήσει ή τροποποιήσει ή διαγράψει δημοπρασία (POST /item, PATCH /item, DELETE /item)
-
Ως προς τον ίδιον τον χρήστη, μπορεί:
- να δει τις ανοικτές του δημοπρασίες (/user/myOpenAuctions)
- να δει τις ολοκληρωμένες του δημοπρασίες (/user/myCompletedAuctions)
- να δει τα bids που έχει κάνει (/user/myBids)
- να δει τα μηνύματα που έχει στείλει (/user/sentMessages) και έχει λάβει (/user/receivedMessages)
- να στείλει μήνυμα στον Highest Bidder μιας δημοπρασίας του (/user/messageBidder/{itemId})
- να λάβει μήνυμα από τον Seller μιας δημοπρασίας που έχει κερδίσει (/user/messageSeller/{itemId})
- να διαγράψει ένα μήνυμα που έστειλε (/user/deleteMessage/{messId}). Τότε διαγράφεται και από τον παραλήπτη. Επίσης όταν πατήσει και διαβάσει το μήνυμα τότε θεωρείται ότι το έχει δει (/user/markMessage/{messId})
- να κάνει rate μετά το πέρας μιας δημοπρασίας αν είναι Seller ή Highest Bidder (/user/rating/{itemId}). Έχουμε κλίμακα 1-5 η οποία μεταφράζεται σε -2/2 για να επιβραβέυουμε δίκαια ή να τιμωρούμε έναν χρήστη ως προς την ποιότητα της δημοπρασίας του. Το rating μπορεί να υποβληθεί μόνο μια φορά από κάθε μέρος
-
Στην αρχική σελίδα της εφαρμογής δεν εμφανίζουμε τις ολοκληρωμένες δημοπρασίες
-
Ως προς το search:
- μπορεί να αναζητήσει στην μπάρα αναζήτησης του front-end ελέυθερο κείμενο για κάθε λέξη του οποίου βρίσκουμε τα items που γίνεται match. Έπειτα εφαρμόζουμε μέθοδο best-fit, δηλαδή πρώτα στη λίστα τοποθετούμε τα items που εμφανίζονται περισσότερες φορές και άρα είναι περισσότερο 'κοντά' στην αναζήτηση και στο τέλος της λίστας τα items πιο είναι λιγότερο 'κοντά' στους όρους της αναζήτησης. Συνεπώς, εμφανίζονται και items στα οποία να εμφανίζονται μεμονωμένοι όροι της αναζήτησης αλλά αυτά θα είναι στο τέλος της λίστας αποτελεσμάτων (/search/searchBar)
- για να διευκολύνουμε τον χρήστη του παρέχουμε μια μέθοδο partial matching που επιστρέφει μια λίστα από προτάσεις με τίτλους δημοπρασιών που περιέχουν τη λέξη/συλλαβή κλειδί που πληκτρολόγησε (/search/partialMatch)
- να κάνει εξειδικευμένη αναζήτηση προσδιορίζοντας προεραιτικά κατηγορία, χαμηλότερη τιμή, υψηλότερη τιμή, τίτλο τοποθεσία και περιγραφή. Όλες οι δοθείσες παράμετροι πρέπει να ισχύουν για να επιλεχθεί μια δημοπρασία ως αποτέλεσμα
-
Bonus
- με τη μέθοδο /recommend/xmlRead διαβάζουμε ένα αρχείο xml από το data-set. Επειδή είναι διαδικασία offline, δεν υπάρχει ανάλογο κουμπί στο front-end
- με τη μέθοδο /recommend/visitor επιστρέφουμε τα 5 items στα οποία υπάρχουν τα περισσότερα bids και αφορά μόνο τους visitors
- με τη μέθοδο /recommend/lsh προτείνουμε σε έναν εγγεγραμμένο χρήστη το πολύ 5 items που τα βρίσκουμε με LSH NN-CF. Για το lsh, χρησιμοποιούμε έτοιμη βιβλιοθήκη: https://github.com/tdebatty/java-LSH
-
Η εφαρμογή δημιουργεί ανά 5 δευτερόλεπτα ένα thread στο οποίο ελέγχονται οι χρόνοι λήξης των δημοπρασιών με τον τρέχοντα χρόνο και κλείνουν όσες πρέπει.
-
Χρησιμοποιούμε SSL self-signed certificate και για το back-end
-
Η βάση δεδομένων που χρησιμοποιούμε είναι η H2.
-
Οι κωδικοί πρόσβασης αποθηκεύονται στη βάση ως hashed με τη χρήση του Spring PasswordEncoder.
-
Η τοποθεσία των χρηστών είναι ίδια κλάση με την τοποθεσία των items και κάθε μια έχει latitude, longitude και locationTitle. Τα δύο πρώτα είναι απαραίτητα για την επιτυχή καταχώρηση της τοποθεσίας.
-
Για το signup (/auth/signup) δεν επιτρέπεται username με δεσμευμένη λέξη πχ. user, item, account, login κτλ ούτε και email. Επίσης πρέπει να είναι 5-15 χαρακτήρες.
Extra υλοποιήσεις: Ένας user μπορεί:
- να άλλαξει το password του (/account/changePassword)
- να δει το ιστορικό επίσκεψης του σε δημοπρασίες (/user/myHistory)
- να λάβει notifications τα οποία μπορούν να είναι των εξής ειδών:
- verification όταν κάποιος admin τον κάνει verified
- ειδοποίηση ότι κέρδισε όταν είναι Highest Bidder μιας δημοπρασίας μετά την λήξη της
- ειδοποίηση ότι μια δημοπρασία του οκοκληρώθηκε, όταν είναι seller
- να δει τα unseen notifications (/user/unseenNotifications), να δει όλα τα notifications (/user/myNotifications), να επιλέξει ως 'seen' ένα (/user/markNotification/{notId}) ή όλα τα unseen notifications (/user/allSeen)
- Open as Project το pom.xml μέσα από το IntelliJIDEA
- Το back-end εκκινείται από το src\main\java\com\Auctions\backEnd\BackEndApplication.java. Κατά την εκκίνηση, δημιουργείται αν δεν υπάρχει ήδη ο admin με username:tediadiktyoy και password:adminadmin. Επιπλέον, πρέπει ο χρήστης να αποδεχτεί στον browser το self-signed πιστοποιητικό μέσω του url: https://localhost:8443.
ΠΡΟΣΟΧΗ: Έχουμε αρχική κενή βάση και σε κάθε εκκίνηση της εφαρμογής η υπάρχουσα βάση θα διαγράφεται και γίνεται κενή. Αν θέλετε persistency αλλάξτε στο application.properties το spring.jpa.hibernate.ddl-auto από create σε update. Τότε σε κάθε εκκίνηση της εφαρμογής η υπάρχουσα βάση θα εμπλουτίζεται.