Projekt konceptualny.
Celem projektu jest stworzenie portalu społecznościowego umożliwiającego nawiązanie nowych kontaktów oraz zaaranżowanie spotkań w celu realizowania swoich pasji i zainteresowań. Portal ten będzie podzielony na grupy tematyczne, w których każdy będzie mógł zakładać oraz wyszukać interesujące wydarzenia w określonym czasie i lokalizacji. Ułatwi to np. zebranie drużyny do gry w koszykówkę czy poznanie nowych znajomych, połączonych podobnymi zainteresowaniami. Ważną funkcjonalnością będzie integracja z Google Maps. Osoby zainteresowane danym spotkaniem będą mogły kliknąć w mapę na wybranym wydarzeniu i tym samym potwierdzić swoją obecność. Meet us - event maganger będzie udostępnia również zaawansowane mechanizmy zarządzania zdarzeniami - wprowadzanie ograniczeń (wiekowych / ilościowych), usuwanie osób zapisanych, regulacja widoczności wydarzeń, powiadomienia. Ważnym elementem będzie także łatwe wyszukiwanie wydarzeń w zależności od zainteresowań, lokalizacji i czasu.
Nasz system wprowadza także mechanizmy pozwalające na ocenę użytkownika jako organizatora. Statystyki, komentarze oraz oceny ułatwiają wybór wydarzenia organizowanego przez nieznaną osobę.
Analiza stanu wyjściowego:
Jak dotąd nie znaleźliśmy portalu, który łączyłby w sobie rozbudowane funkcje tworzenia i zarządzania wydarzeniami z dobrodziejstwem Google Maps. Najpopularniejszym do tej pory rozwiązaniem były wydarzenia w ramach portalu Facebook. W portalu Facebook wydarzenia są zakładane poprzez użytkowników lub Społeczności. Osoby „zaprzyjaźnione” poprzez dodanie do przyjaciół lub przycisk Lubię to, dostają informacje o nowych wydarzeniach i ich zmianach. Facebook umożliwia także zgłoszenie swojego udziału w wydarzeniu. Funkcjami, których nie posiada jest natomiast korelacja wydarzenia z lokalizacją przy użyciu Google Maps i możliwość łatwego wyszukiwania wydarzeń po lokalizacji i kategorii. Portal Facebook nie udostępnia dodawania ograniczeń do tworzonych wydarzeń oraz tworzenia wydarzeń cyklicznych. Nie posiada także rozbudowanych mechanizmów oceny przedsięwzięć oraz ich organizatorów.
Wstępna analiza wymagań użytkownika - przegląd zadań
Integracja z facebook:
Aplikacja dostępna tylko dla użytkowników fb. Login z fb (adres e-mail) jest loginem portalu.
Ustawienie konta:
Informacje użytkownika:
moje eventy - lista wydarzeń, na które użytkownik się zapisał
liczba eventów, w których biorę udział
nadchodzące eventy
Kategorie:
Dodawanie kategorii - dostępne dla użytkowników podczas tworzenia wydarzenia oraz administratora.
Wydarzenia zapisywane są w kontekście kategorii.
Podczas tworzenia wydarzenia użytkownik może wybrać kategorię z listy lub stworzyć własną.
Dodawanie wydarzenia:
termin
czas trwania
inne podstawowe informacje (określone dokładniej w scenariuszach użycia)
mapa
ograniczenia (wiekowe, płeć)
komentowanie wydarzeń
ocena wydarzenia
możliwość zaproszenia znajomych oraz innych osób (po adresie e-mail).
wydarzenia prywatne (tylko dla zaproszonych osób), wydarzenia publiczne (widoczne dla każdego). Widoczność osób zapisanych do wydarzenia - ustala organizator.
Wyszukiwarka eventów - filtry:
kategorie (wiele)
lokalizacja (obszar - zakreślamy na mapie, dostępny okrąg, prostokąt, wielokąt)
osoby biorące w nim udział (w tym moje eventy, wyszukiwanie tylko znajomych, dla kont NIE fikcyjnych) do dopracowania
czas - rozpoczęcie
wydarzenia, do których zostałem zaproszony, publiczne
historyczne (+)- na podstawie daty
Ilość osób widoczna na mapie wydarzenia.
Ogólna mapa wydarzeń (w zależności od czasu).
Zarządzanie eventem:
Powiadomienia e-mail.
Panel administratora:
Wydarzenia historyczne:
Pliki językowe:
Statystyki:
Dodatkowe opcje do rozważenia:
automatyczna lokalizacja użytkownika. Dobór wyszukiwanych wydarzeń na podstawie bieżącej lokalizacji.
gęstość wydarzeń pokazywana w zależności od lokalizacji / czasu na stronie wyszukiwań / stronie głównej.
Scenariusze użycia
Rejestracja użytkownika - aktualnie obsługiwana przez portal Facebook
Założenie konta na Facebooku skutkuje utworzeniem konta użytkownika w bazie portalu Meet-us.
Użytkownik klika link zarejestruj
Pojawia się formularz z danami
Użytkownik klika przycisk zarejestruj.
Następuje weryfikacja danych:
Jeżeli adresy nie zgadzają się, informacja o błędzie.
Jeżeli weryfikacja przejdzie pomyślnie, pojawia się strona z informacją o pomyślnym utworzeniu konta + link do zalogowania.
Użytkownik klika przycisk „Rezygnuj”, następuje powrót do strony głównej.
Logowanie - aktualnie obsługiwane przez portal Facebook
Użytkownik klika zaloguj.
Pojawia się formularz logowania z polami (adres e-mail, hasło, linkiem zapomniałem hasła, linkiem zarejestruj mnie).
Użytkownik podaje adres e-mail.
Użytkownik podaje hasło.
W przypadku niepoprawnej weryfikacji informacja o błędzie i powtórne wyświetlenie tego samego formularza.
W przypadku poprawnej weryfikacji przeniesienie do profilu użytkownika.
W przypadku kliknięcia w link zapomniałem hasła formularz z polem adres e-mail, na który należy wysłać hasło [? Odzyskiwanie hasła jak na fb. Na razie dałam uproszczone]
Kliknięcie w link zarejestruj mnie - przeniesienie na stronę rejestracji.
Dodawanie wydarzeń
Użytkownik chce dodać wydarzenie. Musi się zalogować. Po zalogowaniu trafia na stronę głów / swój profil. Wybiera zakładkę „Wydarzenia”, a następnie opcję „Utwórz nowe wydarzenie” przekierowujący do formularza wydarzenia:
Nazwa wydarzenia
Kategoria
Wybór z listy kategorii
Stworzenie własnej kategorii. Klika przycisk utwórz kategorię. Przeniesie na stronę pośrednią z informacją „Czy na pewno chcesz stworzyć nową kategorię? Stworzenie nowej kategorii w przypadku istnienia podobnej może utrudnić zgromadzenie osób na wydarzenie”. Wymagane potwierdzenie. Brak potwierdzenia = powrót do strony tworzenia eventu. Potwierdzenie = przeniesienie na stronę tworzenia kategorii.
Czas wydarzenia (w podany sposób użytkownik określa czas rozpoczęcia i zakończenia)
Kalendarzyk z wyborem daty.
Weryfikacja daty.
Błędna weryfikacja skutkuje błędem.
Lokalizacja
Podanie adresu ręcznie (pola: miasto, ulica, nr. domu).
Weryfikacja danych (przy pomocy Google Maps).
W przypadku poprawnej weryfikacji automatycznie zostaje dodana mapa z zaznaczonym punktem, w przeciwnym razie pole na czerwono.
Drugą opcją wyboru lokalizacji jest zaznaczenie miejsca na mapie.
Określenie prywatności wydarzenia. (radio button z wyborem: wydarzenie publiczne / prywatne).
W przypadku kliknięcia wydarzenie prywatne:
Pojawia się lista znajomych. Można zaznaczyć wszystkich lub wybrać poszczególny osoby.
Pojawia się link dodaj osobę poprzez adres e-mail. Przekierowuje na b. prostą stronę dodania osoby gdzie podjemy sam adres e-mail na który wysyłane jest zaproszenie.
Wydarzenie publiczne widoczne jest dla wszystkich.
Maxymalna ilość osób. Domyślnie (INF). Pole tekstowy - można wpisać dowolną liczbę całk. > 0. Weryfikacja. W przypadku błędu na czerwono.
Wymaga płeć - lista wyboru (obojętne, mężczyźni, kobiety). Domyślnie obojętne.
Dodaj ograniczenie wiekowe (link/button?). Informacja opcjonalna. Pole min i max wieku.
Opcja pokaż listę osób zapisanych na wydarzenie (true/false).
Czas do kiedy osoby mogą się zapisywać.
Dodatkowe informacje (opcjonalne do wypełnienia pole tekstowe, gdzie można napisać wszystko).Poza tą informacją wszystkie inne są obowiązkowe.
Dodatkowym polem jest opcja: powtórz wydarzeni cyklicznie + określenie czasu powtarzania. Po wybraniu tej opcji system począwszy od daty dodania wydarzenia, będzie co określony czas automatycznie dodawał nowe wydarzenie z datą (dataPierwszego + n*CzasPrzerwy).
Użytkownik klika „Utwórz”. W tym momencie następuje weryfikacja wszystkich danych. Pola niepoprawne zaznaczane na czerwono. Gdy weryfikacja zakończona pomyślnie, użytkownik po potwierdzeniu chęci stworzenia wydarzenia dostaje komunikat, zostaje automatycznie zapisany na stworzone przez siebie wydarzenie.
Użytkownik klika „Rezygnuj”. Następuje przeniesienie do strony „Wydarzenia”.
Wyszukiwanie wydarzeń
Użytkownik musi być zalogowany aby szukać wydarzeń. Wybiera zakładkę „Wydarzenia” / „Szukaj wydarzenia”.
Zostaje przekierowane na stronę gdzie określa filtr wyszukiwania poprzez formularz:
Kategoria (wybór z istniejących, 1 lub więcej, opcja dowolna / zaznacz wszystkie).
Lokalizacja - pole obowiązkowe do wypełnienia:
Wpisanie poprzez formularz dokładnego adresu (miasto, ulica, nr domu). Weryfikacja.
Link „Zaznacz na mapie”, po kliknięciu którego otwiera się mapa gdzie użytkownika zaznacza obszar lub konkretny punkt na mapie.
Czas rozpoczęcia (domyślnie aktualny)
Czas zakończenia (domyślnie określona z góry data - ok. 1 miesiąc)
Wydarzenia do których mam dostęp (true / false). W przypadku gdy użytkownik wyszuka wszystkie wydarzenia, o wydarzeniach dla niego niedostępnych zostanie wyświetlona tylko nazwa.
Wyszukaj wydarzenia, w których biorą udział znajomi (domyślnie false). W przypadku zaznaczenia tej opcji pojawia się lista znajomych do wyboru. Wyszukuje wydarzenia, w których bierze udział przynajmniej jeden ze znajomych.
Sortuj wyniki:
Po czasie (od najnowszych / najstarszych)
Po miejscu (alfabetycznie: miasto, ulica, nr)
Po nazwie alfabetycznie
Dostępne / niedostępne
Możliwość zapisania się / brak (wynikający z braku wolnych miejsc / ograniczeń wiekowych / płciowych itd).
Naciska guzik „Szukaj”.
Naciska przycisk „Rezygnuj”. Następuje powrót do strony „Wydarzenia”.
Użytkownik zostaje przeniesiony na stronę w wynikami, gdzie są wylistowane nazwy wydarzeń + podstawowe informacje w przypadku dostępnych dla użytkownika wydarzeń (miejsce, czas) posortowane wg. zadanego kryterium.
Użytkownik może kliknąć na dowolne wydarzenie aby zobaczyć więcej szczegółów. Jeżeli wydarzenie jest dla niego widoczne zostanie przeniesiony na stronę wydarzenia, jeżeli nie informacja o braku dostępu. Wydarzenia publiczne widoczne są nawet dla niezalogowanych użytkowników. Wydarzenia prywatne tylko po zalogowaniu i weryfikacji.
Informacje zawarte na stronie wydarzenia:
Nazwa,
Lokalizacja
Czas
Zadane ograniczenia
Informacje dodatkowe
Opcjonalnie lista osób zapisanych [zal. od wyboru organizatora]
Organizator
Ilość osób zapisanych (liczba na stronie albo na mapie)
Jeżeli dany użytkownik może się zapisać na wydarzenie (spełnia ograniczenia, pojawia się guzik „Zapisz mnie”)
Jeżeli dany użytkownik może się zapisać na wydarzenie ale nie ma już wolnych miejsc, pojawia się guzik „Powiadom mnie o zwolnionym miejscu”.
Jeżeli upłynął termin zakończenia wydarzenia, pojawia się jego ocena
Komentarze dotyczące wydarzenia
Zapisanie na wydarzenie
Aby zapisać się na wydarzenie użytkownik musi:
Wyszukać je zgodnie z powyższym scenariuszem.
Następnie użytkownik klika przycisk „Zapisz mnie”. Przycisk „Zapisz mnie” jest widoczny jeżeli
użytkownik spełnia ograniczenia wydarzenia oraz
nie upłynął czas zapisu oraz
oraz dany użytkownik nie zapisał się jeszcze na to wydarzenie.
Po potwierdzeniu chęci zapisania, aktualizowana jest strona wydarzenia z danymi o ilości osób. Na stronie „Wydarzenia”, w koncie danego użytkownika pojawia się wydarzenie.
Powiadomienie o zwolnionym miejscu
Użytkownik chce dla danego wydarzenia na które nie ma już miejsc być powiadomiony jeżeli zwolni się miejsce.
Loguje się. Niezalogowani userzy nie mogą zgłaszać chęci powiadomień.
Wyszukuje wydarzenie zgodnie z opisanym sposobem.
Jeżeli dane wydarzenie jest dla niego dostępne może kliknąć opcję „Powiadom mnie o zwolnionym miejscu”.
Informacja o przyjętym zleceniu.
Komentowanie wydarzeń
Użytkownik chce wyrazić opinię na temat wydarzenia, zadań pytanie.
Loguje się. Niezalogowani userzy nie mogą komentować.
Wyszukuje wydarzenie zgodnie z opisanym sposobem.
Klika przycisk „Dodaj komentarz”
Wypełnia pole tekstowe komentarza
Klika przycisk „Wyślij”
Komentarz zostaje dołączony do listy komentarzy
Ocena wydarzenia
Loguje się. Niezalogowani userzy nie mogą wystawiać ocen.
Wyszukuje wydarzenie zgodnie z opisanym sposobem.
Klika przycisk „Oceń”. Przycisk jest widoczny tylko dla użytkowników, którzy byli zapisani na dane wydarzenie i tylko po czasie zakończenia wydarzenia.
Wybiera z listy ocenę 1-10.
Klika przycisk „Wyślij”
System uaktualnia średnią ocen wydarzenia oraz organizatora.
Przeglądanie statystyk
Różne statystyki są udostępnione w zależności od uprawnień. Podstawowe statystyki dostępne dla wszystkich.
Użytkownik wchodzi w zakładkę „Statystyki”
Podstawowe statystyki:
ilość osób zarejestrowanych
ilość osób zalogowanych
ilość wydarzeń
ilość kategorii
średnia ilość wyd. w miesiącu / tygodniu
„najlepszy organizator”
Ustawienie wersji językowej
Użytkownik chce zmienić wersję językową.
Wchodzi na dowolną ze stron portalu. Nie musi być zalogowany.
Klika znajdującą się w [rogu? / na dole?/…] ikonkę.
Jeżeli dotychczasowym językiem wyświetlania strony był język polski, zostaje zamieniony na angielski. i vice versa.
System tłumaczy bieżącą stronę na wymagany język i wyświetla przetłumaczoną. Jednorazowa zmiana języka działa dla wszystkich stron / podstron portalu.
Ustawienia konta
Użytkownik chce zmienić ustawienia swojego konta.
Loguje się.
Wchodzi w zakładkę „Ustawienia konta”.
Dostępne opcje:
Ustawienia powiadomień.
Użytkownik wybiera „Ustawienia powiadomień”.
Pojawia się formularz z możliwościami:
Powiadamiaj mnie o nowych wydarzeniach z kategorii + lista kategorii do wyboru (możliwość wyboru kategorii tak jak w panelu usuwania dla Admina). Możliwość wyboru jednej lub wielu kategorii.
Powiadom mnie o zmianach wydarzeń na które jestem zapisany.
Powiadom mnie o wydarzeniach w mojej okolicy + wybór lokalizacji
Wyślij przypomnienie lista opcja (jeden dzień / dwa dni / trzy dni / tydzień / dokładny czas sprecyzowany przez użytkownika) przed wydarzeniami na które użytkownik jest zapisany.
Deaktywacja konta
Użytkownik chce zrezygnować z usług Meet-Us. Po zalogowaniu pojawia się opcja „Deaktywuj konto”. Spowoduje to dodanie konta to listy nieaktywnych kont. Użytkownik taki nie będzie otrzymywać zaproszeń, ani powiadomień. Zostaną odwołane wszystkie aktywne wydarzenia, których jest organizatorem. Zostanie wypisany z wszystkich aktywnych wydarzeń, w których bierze udział. Po ponownym zalogowaniu będzie miał możliwość aktywowania konta poprzez przycisk „Aktywuj”.
Zarządzanie wydarzeniami
Zarządzać wydarzeniem może tylko jego organizator (osoba, która je założyła).
Po znalezieniu wydarzenia poprzez opisane wyżej wyszukiwanie lub panel „Wydarzenia” / „Moje wydarzenia” organizator poprzez guzik „Edytuj” ma możliwość edycji wszystkich atrybutów wydarzenia. Edycja możliwa jest tylko dla wydarzeń, które jeszcze nie miały miejsca. Widok organizatora stanowią pola podawane przy rejestracji oraz dodatkowo:
Lista wszystkich zapisanych osób oraz możliwość usunięcia zapisanego użytkownika poprzez guzik „Usuń” przy liście zapisanych osób. Po usunięciu osoba nie będzie mogła powtórnie zapisać się na wydarzenie. Po kliknięciu przycisku „Usuń” przy użytkowniku pojawi się [X] oraz opcja „Przywróć”.
Odwołanie wydarzenia, guzik „Odwołaj”.Odwołanie wydarzenia nie powoduje usunięcia go, tylko zamknięcia ze statusem „Odwołane”. Wszyscy zapisani użytkownicy zostaną powiadomieni o tym fakcie.Organizator może zmienić dowolne z pól, tak jak przy tworzeniu wydarzenia.
Po edycji użytkownik klika przycisk „Zapisz zmiany”, które wprowadza zmiany do baz.
Administracja portalem
Usuwanie wydarzeń
Jeżeli użytkownik chce usunąć dowolne wydarzenie musi się zalogować jako Admin.
Wyszukać wydarzenie w opisany sposób.
Kliknąć przycisk „Usuń”, będący elementem widoku admina dla wydarzenia.
Potwierdzić wolę.
Wydarzenie zostaje usunięte, a do wszystkich osób na nie zapisanych zostaje wysłana informacja.
Dodawanie kategorii
Dostępne tylko dla Admina celem założenia pierwszych kategorii.
Loguje się jako Admin.
W panelu „Zarządzanie kategoriami” wybiera opcję „Dodaj kategorię”.
Pojawia się formularz z polem „Nazwa kategorii”.
Wpisuje naszwę
Klika przycisk „Dodaj”.
Kategoria zostaje dodana przez system.
Usuwanie kategorii
Loguje się jako Admin.
W panelu „Zarządzanie kategoriami” wybiera opcję „Usuń kategorię”.
Pojawia się formularz z listą wszystkich kategorii oraz polem tekstowym gdzie można wpisać nazwę (lub jej fragment / regexp) danej kategorii.
Po wpisaniu czegoś w pole tekstowe lista kategorii zawęża się do tych spełniających podane kryteria.
Admin zaznacza kategorię z listy.
Klika przycisk Usuń, potwierdza chęć usunięcia.
Kategoria zostaje usunięta wraz z wszystkimi wydarzeniami do niej należącymi. Do wszystkich osób zapisanych na wydarzenia w niej zostaje wysłana wiadomość.
Blokowanie użytkowników
Loguje się jako Admin.
W panelu „Zarządzanie użytkownikami” , wybiera opcję „Blokuj użytkownika”.
Dalej analogicznie jak przy usuwaniu kategorii wyszukuje użytkownika, klika przycisk „Blokuj” i potwierdza wykonanie operacji.
Inną drogą jest znalezienie profilu użytkownika, następnie w zakładce „Informacje o użytkowniku” kliknięcie przycisku „Blokuj”.
Zablokowane konto jest oznaczone jako „Zablokowane” i może być przywrócone jedynie przez administratora.
Wysyłanie ostrzeżeń
Analogiczne do blokowania użytkownika. Zamiast „blokuj użytkownika” guzik „Wyślij powiadomienie”. Pojawia się okienko z polem na treść wiadomości. Po uzupełnieniu klika przycisk „Wyślij”.
Informacje o użytkowniku
Użytkownik A, chce uzyskać informacje o użytkowniku B.
- Wchodzi w zakładkę Statistics.
- Wybiera opcję - pokaż informacje o użytkowniku
- Podaje imię i nazwisko lub login użytkownika
- Klika przycisk pokaż informacje.
- Wyświetla się:
Organizowane wydarzenia (ilość + lista zorganizowanych wydarzeń)
Średnia ocen wydarzeń
Wydarzenia, w których brał udzial (ilość + lista).
W widoku Admina, pojawia się opcja „Blokuj użytkownika”.
W widoku Admina pojawia się lista ostrzeżeń.
Identyfikacja funkcji
Baza danych ma realizować następujące funkcje:
Przechowywanie / udostępnianie informacji o wydarzeniach (co, gdzie, kiedy, lista, osób, ograniczenia - wszystkie informacje podawane przy zakładaniu wydarzenia).
Grupowanie wydarzeń w kategorie, ułatwiające ich wyszukiwanie.
Kojarzenie wydarzeń z osobami. Korelacja wydarzeń z osobami, ma umożliwić ocenę użytkownika jako organizatora wydarzeń, dostęp do statystyk odnośnie uczestnictwa osób w wydarzeniach różnych kategorii.
W przypadku integracji z facebook'iem osoby te będą reprezentowane przez profile facebook'a.
W przeciwnym przypadku dodatkową funkcjonalnością jest baza użytkowników, przechowywanie informacji o profilach.
Przechowywanie informacji o użytkownikach. Informacji, które są niedostępne z portalu facebook, a konieczne dla działania Meet-Us np. ustawienia powiadomień o nowych wydarzeniach dla każdego użytkownika.
Analiza hierarchii funkcji projektowanej aplikacji
Diagramy przepływu danych
Diagram powiązań między encjami - ERD
Diagram stanów
Projekt logiczny
Doprecyzowanie struktury bazy.
Doprecyzowane bazy nastąpiło poprzez stworzenie z programie Toad fizycznego modelu bazy dla bazy PostgreSQL 8.4. Fizyczny model jest reprezetowany przez diagram ERD, na podstawie którego
został wygenerowany skrypt SQL tworzący bazę. Poniższy rysunek przedstawia końcowy schemat bazy.
Poniżej zamieszczamy link do skryptu wygenerowanego z powyższego schematu przy użyciu narzędzia Toad.
create_db_scrip_2.sql
Jak można łatwo zauważyć wygenerowany skrypt nie jest optymalny. Tworzenie kluczy i indexów nie jest częścią kwerendy „Create table” lecz następuje w wyniku wykonania „Alter table” na już
istniejącej tabeli. Wynika to ze sposobu projektowania modelu - najpierw tworzone są tabele (generowany jest skrpyt Create table), następnie dodawane są do nich relacje (istniejące tabele są
modyfikowane przy użyciu Alter Table).
Dodatkowo wygenerowany skrypt wymagał ręcznej modyfikacji polegającej na zmianie kolejności instrukcji. Tworzenie sekwencji zostało pierwotnie wygenerowane po wykorzystujących je zapytaniach przez co skrypt nie mógł być poprawnie wykonany.
Słownik danych.
Poniżej zamieszczamy dziedziny i ograniczenia dla atrybutów poszczególnych relacji:
Events
event_id - not null, uniqie, pole generowane automatycznie, liczba całkowita > 0, unikalny identyfikator wydarzenia
name - not null, unique, ciąg znaków dł. <50, nazwa wydarzenia
start_time - not null, data + czas z przyszłości, czas rozpoczęcia wyd.
stop_time - not null, data + czas nie wcześniej niż start_time, czas zakończenia wyd.
location - not null, Point, lokalizacja wyd.
is_event_private - not null, bool, określenie czy wydarzenie jest prywatne czy publicczne
max_nr_peopl - liczba całkowita > 0, max ilość osób mogących brać udział w wydarzeniu
required_gender - not null, jeden ze stringów: „man”, „woman”, „no”, wymagana płeć uczestników
min_age - liczba całkowita > 0, wymagany minimalny wiek
sign_in_dealine - data + czas z przyszłości, nie później niż start_time, ostateczny termin zapisu
show_participants - not null, bool, wartość określająca czy należy wyświetlać zuczestników
info - text, dodatkowe informacje o wyarzeniu
repetition_time - liczba całkowita - wartość różna od null oznacza ilość dni, po których nastepuje automatyczne powtórne założenie wydarzenia. czas powtórzenia wydarzenia
creation_date - not null, pole automatyczne, data założenia wydarzenia, data utworzenia wyd.
is_canceled - not null, bool, wartość określająca czy wyd. zostało anulowane
event_category - not null, liczba całkowita - id kategorii, kategoria wyd.
event_owner - not null, liczba całkowita - id uzytkownika, id osoby tworzącej wyd.
Event_marks
creation_date - not null, pole automatyczne, data + czas, data wystawienia oceny
mark - not null, liczba całkowita z przedziału [1-10], ocena wyd.
event_mark_id - not null, pole automatyczne, dodatnia liczba całkowita, id oceny
marked_event_d - not null, dodatnia liczba całkowita, id ocenianego wydarzenia
mark_author_id - not null, dodatnia liczba całkowita, id użytkownika wystawiającego ocenę
Event_comments
creation_date - not null, pole automatyczne, data + czas, data wystawienai komentarza
comment - not null, pole tekstowe, treść komentarza
comment_id - not null, dodatnia liczba całkowita, pole automatyczne. id komentarza
event_id -not null, dodatnia liczba całkowita, id komentowanego wydarzenia
comment_author_id - not null, dodatnia liczba całkowita, id autora komentarza
Users
email - not null, unique, ciąg znaków dł. <50, adres email uzytkownika (login)
active_account - not null, bool, wartość określająca czy konto użytkownika jest aktywne
currently_logged_in - not null, bool, wartość określająca czy użytkownik aktualnie jest zalogowany
blocked_account - not null, bool, wartość określająca czy użytkownik jest zablokowany
creation_date - not null, pole automatyczne, data + czas, data założenia konta
notify_about_changes_in_my_events - not null, bool, wartość określająca czy należy powiadamiać użytkownika o zmiana w wydarzeniach
user_id - not null, pole automatyczne, doatnia liczba całkowita, identyfikator użytkownika
is_admin - not null, bool, wartość określająca czy użytkownik jest adminem
age - not null, doatnia liczba całkowita, wiek
is_man - not null, bool, wartość określająca opłec uzytkownika
Categories
category_name - not null, unikalny ciąg znaków, dł < 50, not null, nazwa kategorii
category_id - not null, unique, dodatnia liczba całkowita, identyfikator kategorii
user_id - not null,dodatnia liczba całkowitu, id użytkownika dodającego kategorię
creation_date - not null, pole automatyczne, data + czas, data dodania kategorii
New_Event_In_Location_Notifications
events_to_notify_location - not null, Polygon, jeśli zostanie założone wydarzenie z lokalizacją wewnątrz polygona przesyłane jest powiadomienie
notification_id - unique, not null, pole automatyczne, całkowita liczba dodatnia, identyfikator notyfikacji
user_id - not null, całkowita liczba dodatnia, id użytkownika do którego przesyłane jest wydarzenie
External_event_participants
participant_id - not null, unique, pole automatyczne, całkowita liczba dodatnia, id osoby niezarejestrowanej w portalu ale zaproszonej na jedno z wydarzeń. (możliwość zapraszania osób spoza portalu na wydarzenia)
email - not null, unique, ciąg znaków dł. < 50
New_event_in_category_notifications
user_id - not null, dodatnia liczba całkowita, id użytkownika powiadamianego
category_id - not null, dodatnia liczba całkowita, id kategorii o wydarzeniach z której użytkownik jet powiadamiany
New_event_by_user_notifications
event_organizer_id - not null, dodatnia liczba calkowita, id użytkownika o wydarzeniach którego są wysyłane powiadomienia
user_id - not null, dodatnia liczba całkowita, id użytkownika, któremu są wysyłane powiadomienia
Event_black_list
event_id - not null, dodatnia liczba całkowita, id wydarzenia
user_id - not null, dodatnia liczba całkowita, id użytkownika, który nie ma wstępu na wydarzenie o event_id
Invitations
event_id - not null, dodatnia liczba całkowita, id wydarzenia na które ktoś jest zapraszany
user_id - not null, dodatnia liczba całkowita, id zapraszanego użytkownika
Participants_and_invited_users
event_id - not null, dodatnia l. całk, id wydarzenia
user_id - not null, dodatnia l. całw, id użytkownika portalu meet_us zaproszonego na wydarzenie o event_id (w przypadku wydarzeń prywatnych wszyscy zaproszeni użytkownicy są dodawani do tej relacji, w przypadku wydarzeń pubicznych tylko użytownicy którzy zapisani na wydarzenie)
is_taking_part - not null, gdy false - oznacza, że event_id jest wydarzeniem prywatnym a user_id został na nie zaproszony ale nie potwierdził uczestnictwa, gdy true - oznacza, że event_id jest wydarzeniem pubicznym, a user_id bierze w nim udział lub event_id jest wydarzeniem prywatnym a user_id został na nie zaproszony i bierze w nim udział
Invited_eternal_users
participant_id - not null, dodatnia l. całk. id osoby nie będącej użytkownikiem portalu ale zaproszonej na jedno z wydarzeń
event_id - not null, dodatnia l.całk - id wydarzenia
Free_places_watchers
event_id - not null, dodatnia l. calk. id obserwowanego wyd.
user_id - not null, dodatnia l. całk. id obserwatora powiadamianego gdy zwolnią się jakieś miejsca
Analiza zależności funkcyjnych i normalizacja.
Aby sprawdzić, że baza jest w 3NF należy sprawdzić, że jest w 2NF oraz wszystkie niekluczowe pola zależą tylko od atrybutów kluczowych.
Innymi słowy, nie ma w relacji atrybutów niekluczowych, zależących od czegoś innego niż klucz główny (w szczególności mogących istnieć niezależnie, bez klucza danej tabeli - w takim przypadku
należy dokonać dekompozycji tabeli).
Aby sprawdzić, że baza jest w 2NF należy sprawdzić, że wszystkie atrybuty niekluczowe zależą od całego klucza.
Jest to istotne w przypadku kluczy zlożonych.
W przypadku kluczy prostych, gdzie cały klucz stanowi jeden atrybut, 2NF dostajemy „za darmo”.
Sprawdzenie 2NF:
W opracowanym schemacie bazy przedstawionym na pierwszym diagramie tabele:
posiadają prosty klucz główny zatem wszystkie atrybuty zależą od całego klucza głównego.
Relacjami posiadającymi złożony klucz główny są tabele:
new_ev_in_cat_notifications
new_ev_by_user_notifications
event_black_lists
invitations
participants_and_invited_users
invited_external_users
free_places_watchers
Tabele te nie posiadają żadnych atrybutów nie-kluczowych, dlatego są również w 2NF.
Sprawdzenie 3NF:
opisują konkretne wydarzenie, zależą od klucza event_id i nie mogą bez niego istnieć (nie mają sensu bez konretnego wydarzenia).
są charakterystycze dla konta użytkownika i nie mogą bez niego istnieć
Oba strybuty są charakterystyczne dla konkretnej, wystawionej oceny i zależą od event_mark_id
charakterystyczne dla konretnego komentarza, zależa od event_comment_id
W podany sposób zostało sprawdzone, że otrzymana struktura jest w 3NF. We wczesnych fazach pojektowania, jednen z pierwszych powstałych diagramów ERD był w 1NF.
Część tabel została zdekomponowana, klucze złożone zostały zamienione na proste poprzez wprowadzenie id.
Projektowanie operacji na danych.
Raport końcowy
Obsługa bazy danych i logika aplikacji
Baza danych została zaprojektowana z wykorzystaniem narzędzia Toad.
Ze stworzonych diagramów ERD, został wygenerowany skrypt w języku PostgreSQL.
Automatyczne generowanie skryptu bazy okazało się być rozwiązaniem wygodnym, jednak generującym błędy wymagające ręcznego poprawienia.
Logika aplikacji i komunikacja z bazą zostały zaimplementowane w języku Java.
Unordered List ItemJako silnik aplikacji został wybrany JBoss 6.0.
Mapowanie obiektowo-relacyjne zostało przperowadzone z wykorzystaniem modułu JPA i frameworku Hibernate.
Zapytania kierowane do bazy zostały stworzone w języku Hibernate Query Language (HQL) i zaimplementowane wewnątrz beanów w ramach modułu EJB (wykorzystana wersja 3.0).
Poniższy przyklad przedstawia fragment beana realizującego blokowanie konta użytkownika.
@Override
public void addEventComment(String eventName, String comment, String author) throws NoSuchEvent, NoSuchUserException {
String getEvent = "SELECT a FROM Event as a WHERE a.eventName=?";
Query getEventQ = em.createQuery(getEvent);
getEventQ.setParameter(1, eventName);
try{
Event ev=(Event) getEventQ.getSingleResult();
EventComment eventComment=new EventComment();
eventComment.setComment(comment);
eventComment.setEvent(ev);
eventComment.setCreationDate(new Timestamp(Calendar.getInstance().getTimeInMillis()));
String getAuthor= "SELECT a FROM User as a WHERE a.email=?";
Query getAuthorQ=em.createQuery(getAuthor);
getAuthorQ.setParameter(1, author);
try{
User u=(User)getAuthorQ.getSingleResult();
eventComment.setUser(u);
em.merge(eventComment);
}
catch(NoResultException e){
throw new NoSuchUserException("");
}
}
catch(NoResultException e){
throw new NoSuchEvent();
}
}
Działanie beanów zostało przetestowane przy pomocy testów jednostkowych z wykorzystaniem frameworku JUnit4.
Przykład testu, pokazujący korzystanie z API dostarczonego przez moduł EJB.
@Test
public void addEventComment() throws InactiveUserAccount, NoSuchUserException, ObjectAlreadyExistsException, NoSuchCategoryException, NotCompleteInfoException, WrongInputData, NoSuchEvent{
long now=Calendar.getInstance().getTimeInMillis();
long oneDayInMilis=24*60*60*1000;
long startTime=now+oneDayInMilis*7;
long singInDeadline=startTime-2*oneDayInMilis;
long stopTime=startTime+2*60*60*1000;
EventTimes times=new EventTimes(startTime, stopTime, singInDeadline, false, null);
Location loc=new Location(100L, 200L);
ParticipantRequirements reqs=new ParticipantRequirements(34, 12, false, RequiredGender.NONE, false, null);
userEjb.addNewUser{{:pl:dydaktyka:ztb:2011:projekty:meetus:dodawanie_wydarzen.png|}}("dora", 23, false, false);
catEjb.addCategory("noga", "dora");
eventEjb.addEvent("mecz","noga" , "whatever", "dora",times,reqs,loc);
eventEjb.addEventComment("mecz", "bylo fajnie", "dora");
}
Interfejs
Do aplikacji został dołącząny interfejs wwww.
Logowanie. Zostało zaimplementowane poprzez integrację z portalem facebook.
Takie rozwiązanie umożliwia użytkownikom facebooka automatyczne logowanie do naszego serwisu.
Po zalogowaniu użytkownik przenoszony jest na stronę portalu gdzie dostępne są takie opcje jak wyszukiwanie wydarzeń, dodawanie wydarzeń, dodawanie kategorii, statystyki i inne. Przykładowy formularz dodawania wydarzenia:
W ramach projektu została zaimplementowana integracja z mapami Google umożliwiająca w prosty
sposób wybór lokalizacji poszukiwanego zdarzenia:
Testy
Logika aplikacji została przetestowana z wykorzystaniem testów jednostkowych.
Podczas tworzenia testów została wykorzystana technika nazewnictwa testów zaprezentwana w poniższym tutoriali http://vimeo.com/10569751 .
Polega ona na nazwaniu klasy testowej zgodnie z konwencją: TestedClassShould, a kolejne metody testu określaja co klasa powinnna robić.
Np. class UserBeanShould wraz z metodami testowymi @Test public void enableAddingNewUsers(), @Test public void returnNumberOfUsers();
Taka technika nazewnictwa sprawdza się szczególnie przy tworzeniu oprogramowania zgodnie z TDD. Pozwala na łatwe zdefiniowanie interfejsu klasy poptrzez stworzenie odpowiednich testów. Na podstawie testów uzupełniana jest implementacja klasy.