SQLite & PDO SQLite support missing in this PHP install - plugin will not work

Meet Us

Poniżej jest umieszczana automatycznie treść podstrony meetus znajdującej się w namespace projektu. Proszę ją utworzyć i traktować jako stronę startową - tam umieszczamy linki do poszczególnych podstron, które też mają się znajdować w projekcie, np. analiza_wymagan. W namespace mogą też Państwo umieszczać pliki (obrazki, diagramy, archiwa) linkowane na stronie danego projektu. Proszę usunąć ten akapit po zapoznaniu się z jego treścią.

Projekt konceptualny.

Sformułowanie zadania projektowego - cel projektu

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ń

  1. Integracja z facebook:
    • logowanie
    • rejestracja
    • profil użytkownika
    • możliwość integracji wydarzeń / wiadomości (?) (na przyszłość)
  1. Aplikacja dostępna tylko dla użytkowników fb. Login z fb (adres e-mail) jest loginem portalu.
  1. Ustawienie konta:
    • powiadomienia o nowych wydarzeniach / zwolnionym miejscu.
    • statystyki (dostępne dla użytkownika oraz administratora) - informacje o użytkowniku. Możliwość dodawania zapytań.
  1. 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
  1. Kategorie:
  2. Dodawanie kategorii - dostępne dla użytkowników podczas tworzenia wydarzenia oraz administratora.
  3. Wydarzenia zapisywane są w kontekście kategorii.
  4. Podczas tworzenia wydarzenia użytkownik może wybrać kategorię z listy lub stworzyć własną.
  5. 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.
  6. 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
  7. Ilość osób widoczna na mapie wydarzenia.
  8. Ogólna mapa wydarzeń (w zależności od czasu).
  9. Zarządzanie eventem:
    • odwoływanie
    • zmiana terminu
    • zmiana lokalizacji
    • zapraszanie osób
    • lista osób zapisanych
    • limit osób (min. liczba osób, maksymalna, nie dotyczy)
    • modyfikacja liczby osób
    • usuwanie osób.
  10. Powiadomienia e-mail.
  11. Panel administratora:
    • usuwanie wydarzeń
    • usuwanie kategorii
    • blokowanie użytkowników
    • ostrzeżenia
    • badanie aktywności użytkowników
    • podstawowe statystyki (do dopracowania)
  12. Wydarzenia historyczne:
    • przechowywane przez określony czas
    • możliwość wyszukiwanie poprzez podanie kryterium daty w wyzukiwarce
  13. Pliki językowe:
    • Wersja polska oraz angielska (opcjonalnie).
  14. Statystyki:
    • średnia ocen użytkownika
    • inne: np. ilość wydarzeń w danej kategorii, podstawowe informacje o systemie
  15. 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.

  1. Użytkownik klika link zarejestruj
  2. Pojawia się formularz z danami
    • Dane obowiązkowe do uzupełnienia:
      • Imię
      • Nazwisko
      • Adres e-mail (w 2 polach).
      • Data urodzenia (wybrana z listy - nie ma możliwości podania błędnej)
      • Płeć (radio button)
      • Hasło
    • Dane opcjonalne:
      • Aktualna lokalizacja
  3. Użytkownik klika przycisk zarejestruj.
  4. Następuje weryfikacja danych:
    1. Jeżeli adresy nie zgadzają się, informacja o błędzie.
    2. Jeżeli weryfikacja przejdzie pomyślnie, pojawia się strona z informacją o pomyślnym utworzeniu konta + link do zalogowania.
  5. Użytkownik klika przycisk „Rezygnuj”, następuje powrót do strony głównej.

Logowanie - aktualnie obsługiwane przez portal Facebook

  1. Użytkownik klika zaloguj.
  2. Pojawia się formularz logowania z polami (adres e-mail, hasło, linkiem zapomniałem hasła, linkiem zarejestruj mnie).
  3. Użytkownik podaje adres e-mail.
  4. Użytkownik podaje hasło.
    1. W przypadku niepoprawnej weryfikacji informacja o błędzie i powtórne wyświetlenie tego samego formularza.
    2. W przypadku poprawnej weryfikacji przeniesienie do profilu użytkownika.
  5. 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]
  6. 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:

  1. Nazwa wydarzenia
  2. Kategoria
    1. Wybór z listy kategorii
    2. 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.
  3. Czas wydarzenia (w podany sposób użytkownik określa czas rozpoczęcia i zakończenia)
    1. Kalendarzyk z wyborem daty.
    2. Weryfikacja daty.
    3. Błędna weryfikacja skutkuje błędem.
  4. Lokalizacja
    1. Podanie adresu ręcznie (pola: miasto, ulica, nr. domu).
    2. Weryfikacja danych (przy pomocy Google Maps).
    3. W przypadku poprawnej weryfikacji automatycznie zostaje dodana mapa z zaznaczonym punktem, w przeciwnym razie pole na czerwono.
    4. Drugą opcją wyboru lokalizacji jest zaznaczenie miejsca na mapie.
  5. Określenie prywatności wydarzenia. (radio button z wyborem: wydarzenie publiczne / prywatne).
    1. W przypadku kliknięcia wydarzenie prywatne:
      1. Pojawia się lista znajomych. Można zaznaczyć wszystkich lub wybrać poszczególny osoby.
      2. 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.
      3. Wydarzenie publiczne widoczne jest dla wszystkich.
  6. Maxymalna ilość osób. Domyślnie (INF). Pole tekstowy - można wpisać dowolną liczbę całk. > 0. Weryfikacja. W przypadku błędu na czerwono.
  7. Wymaga płeć - lista wyboru (obojętne, mężczyźni, kobiety). Domyślnie obojętne.
  8. Dodaj ograniczenie wiekowe (link/button?). Informacja opcjonalna. Pole min i max wieku.
  9. Opcja pokaż listę osób zapisanych na wydarzenie (true/false).
  10. Czas do kiedy osoby mogą się zapisywać.
  11. Dodatkowe informacje (opcjonalne do wypełnienia pole tekstowe, gdzie można napisać wszystko).Poza tą informacją wszystkie inne są obowiązkowe.
  12. 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).
  13. 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.
  14. 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:

  1. Kategoria (wybór z istniejących, 1 lub więcej, opcja dowolna / zaznacz wszystkie).
  2. Lokalizacja - pole obowiązkowe do wypełnienia:
    1. Wpisanie poprzez formularz dokładnego adresu (miasto, ulica, nr domu). Weryfikacja.
    2. Link „Zaznacz na mapie”, po kliknięciu którego otwiera się mapa gdzie użytkownika zaznacza obszar lub konkretny punkt na mapie.
  3. Czas rozpoczęcia (domyślnie aktualny)
  4. Czas zakończenia (domyślnie określona z góry data - ok. 1 miesiąc)
  5. 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.
  6. 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.
  7. Sortuj wyniki:
    1. Po czasie (od najnowszych / najstarszych)
    2. Po miejscu (alfabetycznie: miasto, ulica, nr)
    3. Po nazwie alfabetycznie
    4. Dostępne / niedostępne
    5. Możliwość zapisania się / brak (wynikający z braku wolnych miejsc / ograniczeń wiekowych / płciowych itd).
  8. Naciska guzik „Szukaj”.
  9. Naciska przycisk „Rezygnuj”. Następuje powrót do strony „Wydarzenia”.
  10. 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.
  11. 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.
  12. Informacje zawarte na stronie wydarzenia:
    1. Nazwa,
    2. Lokalizacja
    3. Czas
    4. Zadane ograniczenia
    5. Informacje dodatkowe
    6. Opcjonalnie lista osób zapisanych [zal. od wyboru organizatora]
    7. Organizator
    8. Ilość osób zapisanych (liczba na stronie albo na mapie)
    9. Jeżeli dany użytkownik może się zapisać na wydarzenie (spełnia ograniczenia, pojawia się guzik „Zapisz mnie”)
    10. 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”.
    11. Jeżeli upłynął termin zakończenia wydarzenia, pojawia się jego ocena
    12. Komentarze dotyczące wydarzenia

Zapisanie na wydarzenie
Aby zapisać się na wydarzenie użytkownik musi:

  1. Wyszukać je zgodnie z powyższym scenariuszem.
  2. 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.
  3. 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.

  1. Loguje się. Niezalogowani userzy nie mogą zgłaszać chęci powiadomień.
  2. Wyszukuje wydarzenie zgodnie z opisanym sposobem.
  3. Jeżeli dane wydarzenie jest dla niego dostępne może kliknąć opcję „Powiadom mnie o zwolnionym miejscu”.
  4. Informacja o przyjętym zleceniu.

Komentowanie wydarzeń
Użytkownik chce wyrazić opinię na temat wydarzenia, zadań pytanie.

  1. Loguje się. Niezalogowani userzy nie mogą komentować.
  2. Wyszukuje wydarzenie zgodnie z opisanym sposobem.
  3. Klika przycisk „Dodaj komentarz”
  4. Wypełnia pole tekstowe komentarza
  5. Klika przycisk „Wyślij”
  6. Komentarz zostaje dołączony do listy komentarzy

Ocena wydarzenia

  1. Loguje się. Niezalogowani userzy nie mogą wystawiać ocen.
  2. Wyszukuje wydarzenie zgodnie z opisanym sposobem.
  3. 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.
  4. Wybiera z listy ocenę 1-10.
  5. Klika przycisk „Wyślij”
  6. 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.

  1. Użytkownik wchodzi w zakładkę „Statystyki”
  2. Podstawowe statystyki:
    1. ilość osób zarejestrowanych
    2. ilość osób zalogowanych
    3. ilość wydarzeń
    4. ilość kategorii
    5. średnia ilość wyd. w miesiącu / tygodniu
    6. „najlepszy organizator”

Ustawienie wersji językowej Użytkownik chce zmienić wersję językową.

  1. Wchodzi na dowolną ze stron portalu. Nie musi być zalogowany.
  2. Klika znajdującą się w [rogu? / na dole?/…] ikonkę.
  3. Jeżeli dotychczasowym językiem wyświetlania strony był język polski, zostaje zamieniony na angielski. i vice versa.
  4. 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.

  1. Loguje się.
  2. Wchodzi w zakładkę „Ustawienia konta”.
  3. Dostępne opcje:
    1. Ustawienia powiadomień.
  4. Użytkownik wybiera „Ustawienia powiadomień”.
    1. Pojawia się formularz z możliwościami:
      1. 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.
      2. Powiadom mnie o zmianach wydarzeń na które jestem zapisany.
      3. Powiadom mnie o wydarzeniach w mojej okolicy + wybór lokalizacji
      4. 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:

  1. 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óć”.
  2. 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.
  3. Po edycji użytkownik klika przycisk „Zapisz zmiany”, które wprowadza zmiany do baz.

Administracja portalem Usuwanie wydarzeń

  1. Jeżeli użytkownik chce usunąć dowolne wydarzenie musi się zalogować jako Admin.
  2. Wyszukać wydarzenie w opisany sposób.
  3. Kliknąć przycisk „Usuń”, będący elementem widoku admina dla wydarzenia.
  4. Potwierdzić wolę.
  5. 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.

  1. Loguje się jako Admin.
    1. W panelu „Zarządzanie kategoriami” wybiera opcję „Dodaj kategorię”.
    2. Pojawia się formularz z polem „Nazwa kategorii”.
    3. Wpisuje naszwę
    4. Klika przycisk „Dodaj”.
    5. Kategoria zostaje dodana przez system.

Usuwanie kategorii

  1. Loguje się jako Admin.
  2. W panelu „Zarządzanie kategoriami” wybiera opcję „Usuń kategorię”.
  3. Pojawia się formularz z listą wszystkich kategorii oraz polem tekstowym gdzie można wpisać nazwę (lub jej fragment / regexp) danej kategorii.
  4. Po wpisaniu czegoś w pole tekstowe lista kategorii zawęża się do tych spełniających podane kryteria.
  5. Admin zaznacza kategorię z listy.
  6. Klika przycisk Usuń, potwierdza chęć usunięcia.
  7. 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

  1. Loguje się jako Admin.
  2. W panelu „Zarządzanie użytkownikami” , wybiera opcję „Blokuj użytkownika”.
    1. Dalej analogicznie jak przy usuwaniu kategorii wyszukuje użytkownika, klika przycisk „Blokuj” i potwierdza wykonanie operacji.
  3. Inną drogą jest znalezienie profilu użytkownika, następnie w zakładce „Informacje o użytkowniku” kliknięcie przycisku „Blokuj”.
  4. 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ę:

  1. Organizowane wydarzenia (ilość + lista zorganizowanych wydarzeń)
  2. Średnia ocen wydarzeń
  3. Wydarzenia, w których brał udzial (ilość + lista).
  4. W widoku Admina, pojawia się opcja „Blokuj użytkownika”.
  5. W widoku Admina pojawia się lista ostrzeżeń.

Identyfikacja funkcji

Baza danych ma realizować następujące funkcje:

  1. Przechowywanie / udostępnianie informacji o wydarzeniach (co, gdzie, kiedy, lista, osób, ograniczenia - wszystkie informacje podawane przy zakładaniu wydarzenia).
  2. Grupowanie wydarzeń w kategorie, ułatwiające ich wyszukiwanie.
  3. 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.
    1. W przypadku integracji z facebook'iem osoby te będą reprezentowane przez profile facebook'a.
    2. W przeciwnym przypadku dodatkową funkcjonalnością jest baza użytkowników, przechowywanie informacji o profilach.
  4. 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 kontekstowy


Diagram wstępny


Zarządzanie kontami użytkowników


Zarządzanie wydarzeniami


Korzystanie z wydarzeń


Zarządzanie kategoriami wydarzeń


Statystyki


Diagram powiązań między encjami - ERD

Diagram stanów

2011/04/15 23:32

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:

  1. 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.
  2. 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ę
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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ł
  13. 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
  14. 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:

  • events
  • users
  • categories
  • event_comments
  • event_marks
  • event_external_participants
  • new_event_in_location_notifications

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:

  • Wszystkie niekluczowe atrybuty tabeli events:
    • name,
    • start_time,
    • stop_time,
    • location,
    • is_event_private,
    • max_nr_people,
    • min_age,
    • show_participants,
    • sign_in_deadline,
    • info (informacja o wydarzeniu)
    • repetition_time
    • creation_date
    • is_canceled

opisują konkretne wydarzenie, zależą od klucza event_id i nie mogą bez niego istnieć (nie mają sensu bez konretnego wydarzenia).

  • W przypadku tabeli users:
    • email
    • is_active_account
    • currently_logged_in
    • blocked_account
    • creation_date
    • notify_about_changes_in_my_events
    • is_admin
    • age
    • is_man

są charakterystycze dla konta użytkownika i nie mogą bez niego istnieć

  • Mark_events
    • creation_date - data dodania oceny
    • mark - ocena wydarzenia S

Oba strybuty są charakterystyczne dla konkretnej, wystawionej oceny i zależą od event_mark_id

  • Event_comments
    • creaton_date - data dodania komentarza
    • comment - komentarz

charakterystyczne dla konretnego komentarza, zależa od event_comment_id

  • New_event_in_loc_notifications
    • event_to_notify_location - polygon określający obszar (lokalizację). użytkownik o danym user_id chce być informowany o wydarzeniach w tej lokalizacji. Charakterystyczne dla danego powiadomienia. Jeden użytkownik może mieć tworzyć wiele powiadomień.
  • External_event_participants
    • email - charakterystyczny i unikalny dla każdego participant_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.

  • Tworzenie konta użytkownika:
    insert into users(email, notify_about_changes_in_my_events, age, is_man) values('zpsoassd@agh.edu.pl',true, 43, false);
    insert into users(email, age, is_man) values('agusia@student.agh.edu.pl', 107, false);
  • Tworzenie konta administratora:
    insert into users( email, is_admin,age,is_man) values('dorota.wojtalow@gmail.com',true, 21, false);
  • Tworzenie kategorii wydarzeń:
    insert into categories (category_name, user_id) values('siatkowka', (select user_id from users where email='ala@poczta.fm')); 
  • Usuwanie kategorii:
    delete from categories where category_id=?;
    	delete from categories where category_name='siatkowka'; 
  • Dodawanie wydarzeń:
    insert into 
    	events(name,start_time,stop_time, location, is_event_private, max_nr_of_people, 
    	required_gender, min_age, show_participants,sign_in_deadline, info, event_category, event_owner) 
    	values('wyjscie na turbacz','2011-06-19 6:00:00', '2011-06-19 20:00:00', point(100,324), 
    	true, 10, 'no', 15, true,'2011-06-16 20:00:00','Wycieczka na Turbacz', 
       (select category_id from categories where category_name='GORY'), (select user_id from users where email='ala@poczta.fm') );
  • Wyszukanie wydarzeń wg. danych kryteriów np. z danej kategorii, w danej lokalizacji, w danym czasie, posortowane po dacie:
    select name, start_time, stop_time, location from events join categories on event_category=category_id 
    where 
    	category_name='siatkowka' and  
    	location <@ polygon '((0,0),(0,500),(500,500),(0,500))' and 
    	events.start_time>=now() and events.start_time<=now()+7 * interval '1 day' order by start_time asc; 
  • Powiadomienie o wolnym miejscu dla danego wydarzenia:
     insert into free_places_watchers (event_id, user_id) values ( 4, 16 ); 
  • Ocena wydarzenia:
     insert into event_marks(mark, marked_event_id, mark_author_id) values(3, 5,6); 
  • Dodanie komentarza:
      insert into event_comments(comment, event_id, comment_author_id) values('Bardzo fajne wydarzenie', 5,7); 
  • Zapisanie na wydarzenie prywatne (zaproszonego użytkownika):
     update participants_and_invited_users
    		set is_taking_part=true
    		where event_id=3 and user_id=5 and ((select sign_in_deadline from events) >= now()); 
  • Zapisanie na wydarzenie publiczne:
     insert into participants_and_invited_users (event_id, user_id, is_taking_part) values (4,5,true); 
  • Rezygnacja z wydarzenia prywatnego:
      update participants_and_invited_users
    		set is_taking_part=false 
  • Rezygnacja z wydarzenia publicznego:
     delete from participants_and_invited_users where event_id=5 and user_id=5;  
  • Zaproszenie użytkowników do wydarzenia:
     insert into participants_and_invited_users(event_id, user_id, is_taking_part) values (?,?,false); 
  • Usunięcie użytkownika z listy gości:
      delete from participants_and_invited_users where event_id=? and user_id=?; 
  • Usunięcie konkretnego wydarzenia:
     delete from events where event_id=5; 
  • Usunięcie wszystkich wyd. użytkownika:
     delete from events where events.event_owner=(select user_id from users where email='dorota.wojtalow@gmail.com'); 
  • Zmiana atrybutów wydarzenia:
     update events 
    	set max_nr_people=10,
    	min_age=20,
    	start_time='2011-06-23 16:00:00',
    	stop_time='2011-06-23 18:00:00'
    	where events.name='mecz siatkówki';
  • Odwolanie wydarzenia:
    update events 
    	set is_canceled=true
    	where events.name='mecz siatkówki'; 
  • Przeglądanie statystyk:
    • Ilość osób zarejestrowanych
       select count(user_id) from users; 
    • Ilość wydarzeń
       select count(event_id) from events; 
    • Ilość kategorii
       select count(category_id) from categories; 
    • Ilość wydarzeń w poszczególnych miesiącach
       select count(event_id), date_part('month',events.start_time) as month  from events group by  date_part('month',events.start_time); 
    • Wypisz 3 najlepszych pracowników
       select email, avg(event_marks.mark) as avarage_mark from users 
      		join events on events.event_owner=users.user_id 
      		join event_marks on event_marks.marked_event_id=events.event_id 
      		group by email order by avg(event_marks.mark) desc limit 3;  
  • Ustawienia konta (powiadomienia o wydarzeniach):
    • Powiadom mnie o nowych wydarzeniach z kategorii
       insert into new_ev_in_cat_notifications (user_id, category_id) values (?,?); 
    • Powiadom mnie o nowych wydarzeniach z mojej okolicy
       insert into new_event_in_loc_notifications(events_to_notify_location, user_id) values (?, ?); 
    • Powiadom mnie o zmianach wydarzeń na które jestem zapisany
       update users
      	set notify_about_changes_in_my_events=true
      	where user_id=4; 
  • Blokowanie uzytkowników:
      update users
    	set blocked_account = true
    	where user_id=4;  
  • Deaktywacja konta:
      update users
    	set active_account=false
    	where user_id=34;   
  • Pobranie informacji o użytkowniku:
    • Organizowane wydarzenia
      select name from events join users on events.event_owner=users.user_id where users.user_id=34;
    • Średnia ocen
       select avg(event_marks.mark) as 'sredna ocen' 
      	from event_marks join events on event_marks.marked_event_id=events.event_id 
      	join users on events.event_owner=users.user_id where user_id=32; 
    • Wydarzenia w których brał udział
       select events.name 
      	from events join participants_and_invited_users using(event_id) 
      	join users using(user_id) where users.user_id=342; 
2011/05/23 19:28

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.

2011/09/25 18:35
2011/04/15 23:31
pl/dydaktyka/ztb/2011/projekty/meetus.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0