1. Raport końcowy
1.1. Implementacja bazy danych
(utworzenie bazy, implementacja obiektów) (realizacja struktury pustej bazy; w oparciu o diagramy ERD i SQL)
Projekt bazy danych
Projekt bazy danych uległ kilkukrotnym modyfikacjom, które jednak nie wpłynęły na ogólną koncepcję bazy.
W trakcie implementacji dodane zostały miedzy innymi:
tabela Votes, służąca do przechowywania danych o głosach na albumy,
kolumny służące do geolokalizacji zdjęć,
czy dodatkowe pole 'accepted' w tabeli Comment.
Tworzenie bazy danych
Projekt został skonfigurowany tak, że możliwe było łatwe stworzenie i przebudowanie bazy danych w razie zmian oraz załadowanie opcjonalnych danych startowych do bazy.
Możliwe to było dzięki stworzeniu pliku BuildInitializer, który był wykonywany podczas budowania projektu. Uruchamiał on skrypt sql (patrz link niżej) oraz ładował dane do bazy. Klasa BuildInitializer była wykorzystywana na etapie tworzenia aplikacji. Gdy zachodziły zmiany w bazie, pozostali członkowie zespołu uruchamiali metody tej klasy, aby zaktualizować strukturę bazy danych. Obecnie jest ona wyłączona (wykomentowane tworzenie tabel oraz uzupełnianie danymi testowymi, w razie potrzeby można odkomentować wymagane metody). Aby uruchomić aplikację należy najpierw utworzyć bazę danych o następujących opcjach:
Nazwa=pastexplorer
Port=5432
User=postgres
Hasło=qwe
oraz wykonać wspomniany wyżej skrypt SQL:
Skrypt sql do tworzenia bazy danych:
create_tables.sql
Do działania aplikacji nie są wymagane żadne początkowe dane. Wszystkie dane są wprowadzane przy użyciu formularzy.
1.2. Zdefiniowanie interfejsów do prezentacji, edycji i obsługi danych
Poniżej przedstawione zostały formularze służące do wprowadzania danych przez użytkowników, w większości związane z dodawaniem przez nich nowych treści (albumów, zdjęć) do serwisu.
Rejestracja użytkownika
Logowanie użytkownika
Tworzenie albumu
Dodawanie zdjęcia do albumu
1.3. Zdefiniowanie dokumentów do przetwarzania i prezentacji danych
Poniżej przedstawione zostały widoki służące do wyświetlania danych (albumów, zdjęć, itp.) stanowiących treść serwisu tworzoną przez użytkowników.
Strona główna serwisu
Przeglądanie albumu
Przeglądanie profilu użytkownika
Przeglądanie albumów
Rankingi albumów
1.4. Zdefiniowanie panelu sterowania aplikacji
Poniżej przedstawione zostały formularze pozwalające użytkownikowi na zarządzenie jego kontem oraz zawartością dodaną przez niego do serwisu, np. albumami i zdjęciami.
Panel użytkownika
Zarządzanie albumami
Ustawienia konta/profilu użytkownika
Zmiana hasła do konta
Zarządzanie albumem
1.5. Zdefiniowanie makropoleceń dla realizacji typowych operacji
Do mapowania ORM w projekcie wykorzystaliśmy framework NHibernate. Dokonuje on mapowania obiektów na tabele bazy danych.
Nasze podstawowe polecenia zostały podzielone na kategorie: Album, User, Photo (operacje na albumach, na kontach użytkownika oraz na zdjęciach). Wykorzystano wzorzec Repository do implementacji dostępu do bazy danych. Każde repozytorium obiektów (UserRepositor, AlbumRepository, PhotoRepository) posiada podstawowe funkcje:
GetById - zwraca obiekt o danym ID
Create - zapisuje obiekt w bazie danych
Delete - usuwa obiekt z bazy danych
Update - aktualizuje obiekt w bazie danych
Wszelkie zapytania do bazy danych wykonywane są przy użyciu języka HQL (obiektowy język zapytań do bazy danych dla Hibernate, podobny w składni do SQL). Dodatkowo w pewnych przypadkach, gdy nie potrafiliśmy zapisać pewnych zapytań w języku HQL (z powodu małej znajomości tego narzędzia) wykorzystaliśmy czysty język SQL.
Ponadto każde repozytorium posiada własne dodatkowe funkcje (np. AlbumRepository - AddComment, Subscribe itd.)
NHibernate standardowo zapewnia funkcje: Create, Delete, Update które przyjmują pewien obiekt. Dodatkowe polecenia wymagają użycia HQL lub SQL, np.
Pobranie albumu po id:
session.CreateQuery(„from AlbumModel where Id = :id”).SetParameter(„id”, id).UniqueResult<AlbumModel>();
Dla pozostałych poleceń zapytania wyglądają analogicznie, różnią się tylko typem obiektu.
1.6. Uruchamianie i testowanie aplikacji
Początkowo każdy członek zespołu uruchamiał i testował aplikację lokalnie na swoim komputerze. Gdy zaimplementowano większość wymaganych funkcjonalności aplikacja została uruchomiona na serwerze i testowana zdalna przez każdego członka zespołu. Pozwoliło to operować na wspólnych danych. Testy były wykonywane ręcznie.
1.7. Wprowadzanie danych
Aplikacja nie wymaga dodatkowych danych do prawidłowego funkcjonowania. Dane są wprowadzane przy użyciu formularzy: tworzenie kont, albumów, wysyłanie zdjęć itp. Nie jest zalecana inne metoda, np. ręcznego wprowadzania danych do bazy oraz tworzenia katalogów, gdyż można naruszyć integralność danych. W przypadku użycia formularzy aplikacja zadba o to, by zawartość bazy danych odpowiadała zawartości plików na dysku. Możliwe jest przeniesienie danych z jednego serwera na inny, należy jednak przenieść zarówno zawartość bazy danych jak i strukturę folderów na dysku.
1.8. Wdrażanie systemu do użytkowania
Aby uruchomić aplikację należy najpierw utworzyć bazę danych o następujących opcjach:
Nazwa=pastexplorer
Port=5432
User=postgres
Hasło=qwe
oraz wykonać skrypt:
create_tables.sql
Następnie aplikację należy uruchomić na serwerze IIS, który należy skonfigurować w zależności od potrzeb przy użyciu plików konfiguracyjnych serwera (np. applicationhost.config).
Najprostszym sposobem jest wykorzystanie środowiska VisualStudio, które większość kroków przeprowadzi automatycznie.
Wraz z aplikacją uruchomiony zostanie dodatkowo Scheduler zadań, odpowiedzialny za wysyłanie okresowych powiadomień e-mail.
1.9. Przeprowadzenie szkolenia użytkowników
Szkolenie użytkowników nie jest wymagane. Interfejs użytkownika bazuje na popularnych portalach społecznościowych, jest bardzo przejrzysty i intuicyjny.
1.10. Zapewnienie dokumentacji technicznej i użytkowej
Na obecnym etapie implementacji nie jest dostępna możliwość administracji. Każdy użytkownik może samodzielnie moderować komentarze i albumy, więc nie jest konieczne posiadanie administratora serwisu (chociaż w przyszłości taka rola na pewno zostanie wprowadzona).
Za dokumentację techniczną może posłużyć ten dokument jak i pozostałe dokumenty:
1.11. Zapewnienie obsługiwania systemu po wdrożeniu
Utrzymanie aplikacji jest ograniczone do utrzymania serwera www oraz bazy danych. Ze względu na charakter aplikacji wymagany jest duży transfer danych i stosunkowo duża pojemność dysków (przechowywanie zdjęć).
1.12. Rozwijanie i modyfikowanie aplikacji
Aplikacja jest łatwa do rozbudowy, wykonana jest przy użyciu wzorca MVC, więc warstwa logiki jest oddzielona od warstwy prezentacji i warstwy bazodanowej. Aplikacja może być rozbudowana o dodatkowe funkcjonalności (nie zostały one zaimplementowana z powodu ograniczenia czasowego):
Administracja aplikacją - statystyki, moderacja, banowanie użytkowników itp.
Integracja z innymi portalami społecznościowymi
Drzewko komentarzy - odpowiedź na konkretny komentarz
Ostatnie zmiany w profilu użytkownika - lista nowych komentarzy, zdjęć itp. od ostatniej wizyty
Wyszukiwanie albumów/zdjęć/użytkowników
PostGis - wyszukiwanie zdjęć na zadanym obszarze, w danej okolicy. Przeglądanie albumów sąsiadów (w zadanej odległości od miejsca zamieszkania użytkownika).
Aplikacja mobilna - wprowadzenie do aplikacji mobilnej wszystkich funkcjonalności portalu
1.13. Opracowanie doświadczeń wynikających z realizacji projektu
Projekt był prowadzony według określonej metodyki. W projektach studenckich etap projektowania i analizy jest często pomijany, w tym projekcie postąpiliśmy inaczej. Etap implementacji został poprzedzony analizą problemu i projektem bazy danych oraz architektury aplikacji. Pozwoliło to na uniknięcie wielu nieścisłości i problemów przy implementacji projektu.
Postanowiliśmy wykorzystać nieznane nam technologie (C#, MVC .Net, programowanie aplikacji na platformę Android, NHibernate, Quartz). Framework mapowania obiektowo-relacyjnego NHibernate jest popularnym narzędziem, wiedza wyniesiona z projektu na temat tego frameworku będzie na pewno wykorzystana w przyszłości, nie tylko przy tworzeniu aplikacji w środowisku .Net, ale też w środowisku Java, z którego wywodzi się Hibernate.
Poznaliśmy język C#, który nie występuje w programie studiów, co było cennym doświadczeniem. Podstawowa wiedza zdobyta w projekcie umożliwia nam tworzenie prostych aplikacji w tym języku.
Umiejętność pisania aplikacji na urządzenia mobilne również będzie użyteczna, gdyż urządzenia te zyskują coraz większą popularność.
W związku z tym, że wykorzystaliśmy zupełnie obce nam technologie (z wyjątkiem PostgreSQL, który był nam znany) musieliśmy rozwiązać wiele problemów wynikających z niewiedzy, poszukując różnych materiałów i informacji o użytych technologiach.
1.14. Aplikacja mobilna
W ramach projektu zaimplementowana została prosta aplikacja mobilna zintegrowana z serwisem i umożliwiająca korzystanie z podzbioru jego funkcjonalności za pomocą dowolnego telefonu wyposażonego w system Android.
Obsługiwane funkcjonalności to:
przeglądanie albumów zalogowanego użytkownika
robienie nowego zdjęcia (z nałożonym przezroczystym ostatnim zdjęciem - ułatwienie kadrowania) oraz jego wysłanie do serwisu
Webservice (REST API)
Aplikacja komunikuje się z serwisem za pośrednictwem udostępnionego webserwisu z API zaprojektowanym w modelu REST. Poniżej przedstawione zostały przykładowe wywołania wraz ze zwróconymi wynikami.
GET /api/users/JanekKowalski
{
"ok": true,
"data": {
"id": 3,
"username": "JanekKowalski",
"date_of_birth": {
"day": 1,
"month": 3,
"year": 1989
},
"about": "Jestem z Krakowa. Lubię jeździć na rowerze.",
"albums": [
"http://localhost:3518/api/albums/5",
"http://localhost:3518/api/albums/18"
]
}
}
GET /api/albums/5
{
"ok": true,
"data": {
"id": 5,
"name": "Moja twarz",
"description": "Jak zmieniałem się w czasie",
"category": "People",
"owner": "JanekKowalski",
"is_public": true,
"rating": 10,
"views": 1234,
"photos": [
"http://localhost:3518/api/photos/1",
"http://localhost:3518/api/photos/2",
"http://localhost:3518/api/photos/3",
"http://localhost:3518/api/photos/4",
"http://localhost:3518/api/photos/5",
"http://localhost:3518/api/photos/6",
"http://localhost:3518/api/photos/7"
],
"comments": []
}
}
GET /api/photos/2
{
"ok": true,
"data": {
"id": 2,
"album": "http://localhost:3518/api/albums/5",
"date": {
"day": 30,
"month": 4,
"year": 2011
},
"description": "Oto ja",
"image": "http://localhost:3518/Static/photos/photo_2012051022450267.jpg",
"thumbnail": "http://localhost:3518/Static/photos/photo_2012051022450267_mini.jpg",
"latitude": 25.21356,
"longitude": 34.12357
}
}
Wysyłanie zdjęcia
POST /api/photos
(... HTTP Body: zdjęcie, metadane ...)
// zdjęcie jako plik binarny zakodowany w Base64
// metadane: album id, opis zdjęcia, data zdjęcia, lokalizacja zdjęcia (GPS geotag)
1.15. Wykaz literatury, załączniki
Literatura
Użyte narzędzia oraz ich dokumentacje