###Piotr Gorczyca
###Aplikacja mobilna dla biegaczy Run!
####Krótki opis działania aplikacji Aplikacja ma na celu umożliwienie jej użytkownikom łatwej komunikacji w celu ustalenia wspólnych treningów biegowych, dzięki implementacji następujących funkcjonalności:
- Tworzenie nowego konta
- Edycja profilu
- Wysyłanie i odbieranie prywatnych wiadomości
- Przeglądanie profilów innych użytkowników
- Odczytywanie/dodawanie komentarzy na profilach innych użytkowników
- Wyświetlanie listy treningów dodanych przez użytkowników
- Dodawanie/usuwanie treningów
- Możliwość zgłoszenia udziału w danym treningu
- Wyszukiwanie użytkowników
####Technologie zastosowane przy budowie aplikacji oraz bazy danych Projekt składa się z dwóch części:
-
Bazy danych zaimplementowanej w MySQL do której obsługi użyłem ogólnodostępnego frameworka Phalcon PHP. Do jego wyboru przekonały mnie liczne opinie nt. jego wysokiej wydajności w porównaniu do innych popularnych framworków. Stworzyłem proste API, które ma za zadanie ułatwić komunikację z aplikacją poprzez pobieranie danych oraz kodowanie ich w formacie JSON (analogicznie w przypadku zapisu danych).
-
Aplikacji android do której utworzenia wykorzystałem bibliotekę Volley ułatwiającą tworzenie zapytań.
####Opis struktury bazy danych
Baza danych składa się z 6 tabel:
- users – tabela reprezentująca pojedynczego użytkownika
- trainings – tabela reprezentująca pojedynczy trening
- comments – tabela reprezentująca pojedynczy komentarz
- messages – tabela reprezentująca pojedyńczą wiadomość
- attendings – tabela reprezentująca powiązanie pomiędzy treningiem a osobą biorącą w nim udział
- profiles – tabela reprezentująca profil pojedynczego użytkownika
Implementacje powyższych metod znajdują się w pliku index.php, w katalogu api/ projektu. Oprócz standardowych zapytań typu SELECT, INSERT, UPDATE, DELETE stworzyłem również kilka funkcji pomocniczych w bazie MySQL:
-
getAverageDistanceByGender(Gender VARCHAR(10)) – zwraca średni dystans treningów względem płci
-
getMaxDistanceById(id INT(11)) – zwraca maksymalny przebiegnięty dystans przez użytkownika o podanym id
-
getNewUserCountByGender(Gender VARCHAR(10)) – zwraca liczbę nowych użytkowników zarejestrowanych w bieżącym miesiący względem płci
-
getTotalDistanceById(id INT(11)) – zwraca całkowity dystans przebiegnięty przez osobe o podanym id
-
idIntoUniqueId(id INT(11)) – zwraca unikalne id użytkownika bazując na publicznym id, funkcja służy do przypisania wiadomości do odpowiedniego odbiorcy, bez znajomości jego unikalnego (prywatnego) id Utworzyłem trigger odpowiedzialny za dodanie nowego wiersza do tabeli profiles po utworzeniu nowego konta, a także widok do wyświetlania wszystkich przyszłych treningów. #####Struktura plików katalogu api/ :
-
.htaccess – plik konfiguracyjny serwera Apache
-
index.php – plik zawierający implementację podanych wyżej metod GET, POST, PUT, DELETE
-
config.php – plik zawierający dane potrzebne do połączenia się z serwerem lokalnym oraz bazą danych takie jak: nazwa użytkownika, hasło, nazwa bazy danych
-
PassHash.php – plik zawierający implementację funkcji odpowiedzialnych za (de)kodowanie hasła oraz sprawdzanie jego poprawności
-
models/ - folder zawierający pliki php opisujące model danych zawartych w poszczególnych tabelach
####Opis struktury aplikacji mobilnej Aplikacja składa się na 12 „ekranów”, są to:
- Ekran logowania
- Ekran rejestracji
- Lista treningów
- Ekran danego treningu
- Profil użytkownika
- Statystyki
- Wiadomości
- Ekran czatu
- Edycja danych profilu
- Ekran dodawania komentarza (formularz)
- Ekran dodawania treningu (formularz)
- Wyszukiwanie użytkowników
Zarządzanie sesją logowania Aplikacja dodatkowo korzysta z bazy SQLite, aby przechowywać najczęściej używane, powtarzające się dane. Tabela przechowuje dane aktualnie zalogowanego użytkownika takie jak:
- Imię
- Adres e-mail
- Unikalne id
- Publiczne id
- Datę utworzenia konta
Dane te przekazywane są podczas pomyślnego zalogowania do aplikacji i przechowywane do momentu wylogowania się przez użytkownika. W celu zarządzania sesją logowania stworzyłem klasę o nazwie SessionManager, w której przy pomocy Shared Preferences przechowuję wartość typu boolean mówiącą o tym czy użytkownik jest zalogowany. Po pomyślnym zalogowaniu wartość wspomnianego pola ustawiana jest na true, a przypadku wylogowania na false.
####Przykładowe screeny z działającej aplikacji
Źródła, z których korzystałem: