Karta Projektu
Motywacja:
Portal ivent.pl będzie pozwalał znaleźć osoby chętne na wspólne spędzenie wolnego czasu w konkretny sposób, jak np. wyjście na rower, na kręgle, grę w paintball. Portal skierowany byłby przede wszystkim do osób chcących coś zrobić teraz, czyli danego wieczoru, danego dnia.
Obecnie nie istnieje serwis umożliwiający kontaktowanie się osobom, chcącym zagospodarować swój aktualnie wolny czas. Można znaleźć nieudane próby tego typu przedsięwzięć, jednak nie spełniły one oczekiwań użytkowników.
Pieniądze można zarobić na reklamach (np. reklamy tematyczne instytucji z branży rozrywkowej).
Opis istniejących rozwiązań:
Przykładem może być portal niemamzkim.pl, który jest nastawiony na długoterminowe hobby, ogólne pomysły bez konkretnego terminu realizacji. Naszym zdaniem z tego właśnie powodu nie cieszą się zainteresowaniem.
Gumtree - brak skonkretyzowanego podziału na kategorie i miejsca. Mała wiarygodność, brak systemu oceny użytkowników.
Facebookowe eventy – rozwiązanie nie jest dedykowane dla istniejących potrzeb, lecz jedynie prowizorką wykorzystującą dostępne możliwości
Innowacyjność rozwiązania:
Nasze rozwiązanie będzie się różniło od wyżej przedstawionych:
podział na kategorie,
wyszukiwanie w ramach danej kategorii, miejsca, czasu,
system wiarygodności użytkowników, oceny ich przedsięwzięć, raportowania nadużyć,
informowanie użytkowników o nowych chętnych współtowarzyszach Inicjatywy,
informowanie o preferowanych (wybieranych poprzez zaznaczenie kategorii w profilu) Inicjatywach w jego okolicy,
Zakres funkcjonalności
Must:
dodawanie własnych iventów,
wyszukiwanie iventów na podstawie nazwy i statusu,
możliwość kontaktu z autorem iventu,
-
Should:
system komentarzy/ocen użytkowników (1. użytkownicy oceniają ivemt autora, 2. autor ocenia użytkowników oraz zaznacza czy wszyscy „chętni” stawili się na ivencie),
informowanie autorów o statusie ich iventów (liczbie chętnych użytkowników - i na koncie portalu, i mailowo/smsowo),
Could:
bieżące informowanie przy ogłoszeniu o liczbie/nickach chętnych uczestników danego iventu oraz ich komentarzy (could - musimy rozważyć zagrożenia tego rozwiązania, chcemy uniknąć wpisów w stylu „może lepiej byłoby…”),
informowanie użytkowników o iventach w danym miejscu, z pożądanej kategorii,
sprawdzanie wiarygodności użytkownika (podejrzenie statystyk),
aplikacja mobilna,
Metodyka + Harmonogram
Metodyka
Wybór narzędzi
Baza danych
SVN
Harmonogram
Zrealizowane
15.03 - utworzenie karty projektu, wstępny wybór narzędzi
-
10.04 - zaimplementowanie podstawowych funkcjonalności:
rejestracja, autoryzacja użytkownika
dodawanie Inicjatyw, zgłaszanie chęci uczestnictwa w Inicjatywie
system obsługi podziału Inicjatyw na
kategorie
25.04 - wysyłanie zapytań o Inicjatywę do MS Outlook oraz zapis na Inicjatywę z poziomu klienta pocztowego
05.05 - wstępny opis szaty graficznej
10.05 - system oceniania użytkowników i Inicjatyw
10.05 - implementacja funkcjonalności w module administracji
15.05 - wdrożenie podstaw nowej szaty graficznej
30.05 - zamknięcie I etapu tworzenia Portalu z następującymi funkcjonalnościami:
możliwość zapisu na Inicjatywę oraz realizacji alternatywnych scenariuszy (rezygnacja użytkownika, modyfikacja Inicjatywy przez autora)
przeglądanie dostępnych Inicjatyw w zależności od dowolnej właściwości
administrowanie Portalem (Inicjatywy, użytkownicy, kategorie)
Etap II - czerwiec
powiązanie funkcjonalności Portalu z FB (np. publikowanie w imieniu użytkownika)
spotkanie na temat przygotowanego prototypu aplikacji oraz przygotowanie planu kolejnej iteracji
przygotowanie planu wdrożenia i reklamy Portalu
Uwagi
Realizacja projektu
Metodyka prowadzenia projektu
Projekt był prowadzony przy pomocy metodyki zwinnej. Takiego założenia dokonano już na samym początku zawiązywania zespołu. Główną przyczyną takiego podejścia był fakt, że członkowie zespołu nie znali się wcześniej. Nie była znana informacja o wiedzy i rzetelności każdego z nich. Wybór metodyki zwinnej miał za zadanie umożliwić lepsze zapoznanie się członków zespołu poprzez częstsze spotkania.
Tutaj należy zaznaczyć, że metodyka spełniła swoje zadanie – wprawdzie spotkania odbywały się wyłącznie na gruncie naukowym, jednak podczas tych wielu (około 10) krótszych lub dłuższych (nawet do 4h) spotkań członkowie zespołu zapoznał się ze swoimi możliwościami i umiejętnościami a także bardziej zidentyfikowali się z tworzonym projektem.
Innym czynnikiem, którym kierowano się przy wyborze metodyki była chęć ograniczenia ryzyka. Jak już zostało nadmienione – członkowie nie posiadali o sobie żadnych informacji. Zastosowanie metodyki miało na celu jak najwcześniejsze wykrycie ewentualnych problemów z zespołową realizacją projektu. Między innymi właśnie dzięki regularnemu śledzeniu postępów prac, udało się projekt doprowadzić do aktualnej postaci – parokrotnie bowiem zmieniano przydział prac lub dołączano dodatkowego członka zespołu (tutaj należy podkreślić duży wkład Piotra Elsnera w rozwój projektu) do realizacji zadania.
Model cyklu życia oprogramowania
Do zastosowanej w projekcie metodyki zwinnej bardzo dobrze wkomponował się model przyrostowy. Początkowo znano jedynie ogólniki dotyczące wymagań projektowych – wiadomymi były jedynie bliżej nie sprecyzowane cele, których szczegółowe funkcjonalności miały klarować się w czasie implementacji projektu. Czynnikiem, który miał na to duży wpływ, była od początku chęć wprowadzenia produktu na rynek. Stwierdzono, że zespół będzie często modyfikował wymagania, co wynikać będzie z chęci stworzenia jak najbardziej funkcjonalnego produktu.
Jak można stwierdzić z perspektywy czasu – powyższe przewidywania okazały się słuszne, dzięki czemu praca z zastosowanym modelem przyniosła wiele korzyści. Już po krótkim czasie od rozpoczęcia prac, zespół mógł się pochwalić podstawowym modelem strony portalu, na której można było założyć Inicjatywę oraz dokonać przeglądu wcześniej utworzonych. Efekty prac były widoczne, co motywowało do dalszej pracy.
Po okresie paru tygodni nastąpiła seria kluczowych analiz dotyczących sposobu dołączania do iventu i opracowywania algorytmu zarządzania nią i jej uczestnikami. To właśnie dzięki zastosowanemu modelowi przyrostowemu możliwe było na bieżąco obserwowanie skutków wybranego podejścia oraz modyfikacja go. Podobnych sytuacji było kilka, więc można powiedzieć, że wybór modelu sprawdził się w 100%.
Wybrana technologia
Wybór technologii odbył się bardzo szybko. Postanowiono, że będzie do ASP .NET MVC3 używany w środowisku MS Visual Web Developer 2010 Express. Jeden z członków zespołu miał pozytywne doświadczenia z samym ASP .NET, a pozostali wyrazili chęć do nauczenia się tej technologii. Zbierając doświadczenia członków zespołu, można stwierdzić, że:
jest intuicyjna i w zasadzie od razu można zacząć implementować funkcjonalności,
w bardzo przejrzysty sposób nadzoruje korzystanie z poszczególnych warstw aplikacji www,
umożliwia wygodne połączenie z bazą danych, zapewniając odpowiednie mapowanie a także prostotę zarządzania rekordami i tabelami,
jest dobrze udokumentowana a także popularna, więc łatwo można znaleźć rozwiązania dla pojawiających się problemów,
posiada wygodny debugger,
Przy okazji implementacji projektu nie stwierdzono wad powyższej technologii.
Jako serwer bazy danych został wykorzystany MS SQL Server 2008 R2 Express. Decyzja była podyktowana bezproblemową integracją z MS Visual.
Kod przechowywano na Google Code, a zarządzano nim za pomocą narzędzia TortoiseSVN.
Diagramy:
Diagram przypadków użycia
Diagram stanów Inicjatywy
Diagram stanów Autora
Baza danych:
Kategorie
W przypadku kategorii mamy do czynienia z hierarchiczną strukturą drzewiastą.
W naszej bazie danych, każda kategoria oprócz standardowych pól takich jak id, nazwa, id_rodzica, posiada takie pola jak left oraz right. Zasada dobierania, wartości tych pól jest następująca. Jeżeli dany element nie zawiera żadnych pod elementów wtedy right jest większe o 1 od left. W przeciwnym wypadku różnica między nimi musi być taka, aby pomieściły się między nimi analogiczne wartości we wszystkich pod węzłach.
Dzięki takiemu podejściu całe drzewo kategorii (lub dowolny fragment poddrzewa) możemy wyświetlić wykonując tylko jedno zapytaniem do bazy danych.
Przykładowo, aby pobrać wszystkie kategorie i podkategorie znajdujące się w węźle Sport wystarczy pobrać wszystkie rekordy, których pola left są większe od 15 oraz pola right są mniejsze od 20.
Aby znaleźć liczbę elementów danego węzła nie musimy używać funkcji COUNT, wystarczy zastosować się do poniższego wzoru:
(right-left-1)/2
Kod źródłowy implementujący podstawowe operacje na drzewie kategorii:
public static class CategoryManager
{
public static Category CreateNewCategory(string name, int? parent)
{
PInitiativesEntities db = new PInitiativesEntities();
Category parentCategory = db.Categories.SingleOrDefault(c => c.ID == parent);
Category newCategory = new Category(name, parent, parentCategory.Right, parentCategory.Right + 1);
UpdateTreeAfterAdd(parentCategory.Left, parentCategory.Right);
db.Categories.Add(newCategory);
db.SaveChanges();
return newCategory;
}
public static void DeleteCategory(int id)
{
PInitiativesEntities db = new PInitiativesEntities();
Category category = db.Categories.Find(id);
var categoriesToDel = db.Categories.Where(c => c.Left >= category.Left && c.Right <= category.Right).OrderByDescending(c=>c.Left);
foreach (Category c in categoriesToDel)
DeleteSingleCategory(c.ID);
}
private static void DeleteSingleCategory(int id)
{
PInitiativesEntities db = new PInitiativesEntities();
Category categoryToDel = db.Categories.Find(id);
db.Categories.Remove(categoryToDel);
db.SaveChanges();
UpdateTreeAfterDelete(categoryToDel.Left, categoryToDel.Right);
}
public static void EditCategory(int id, string name, int? parent)
{
PInitiativesEntities db = new PInitiativesEntities();
Category categoryToEdit = db.Categories.Find(id);
categoryToEdit.Name = name;
if (categoryToEdit.Parent != parent)
{
categoryToEdit.Parent = parent;
int tmpLeft = categoryToEdit.Left;
int tmpRight = categoryToEdit.Right;
categoryToEdit.Left = 0;
categoryToEdit.Right = 0;
UpdateTreeAfterDelete(tmpLeft, tmpRight);
Category newParentCategory = db.Categories.Find(parent);
tmpLeft = newParentCategory.Right;
tmpRight = newParentCategory.Right + 1;
UpdateTreeAfterAdd(newParentCategory.Left, newParentCategory.Right);
categoryToEdit.Left = tmpLeft;
categoryToEdit.Right = tmpRight;
db.SaveChanges();
}
db.SaveChanges();
}
private static void UpdateTreeAfterDelete(int left, int right)
{
PInitiativesEntities db = new PInitiativesEntities();
var categories = db.Categories.Where(c => c.Right >= right);
foreach (Category c in categories)
{
if (c.Left > left)
c.Left -= 2;
c.Right -= 2;
}
db.SaveChanges();
}
private static void UpdateTreeAfterAdd(int left, int right)
{
PInitiativesEntities db = new PInitiativesEntities();
var categories = db.Categories.Where(c => c.Right >= right);
foreach (Category c in categories)
{
if (c.Left > left)
c.Left += 2;
c.Right += 2;
}
db.SaveChanges();
}
}
Integracja z kalendarzem programu MS Outlook
Nasz serwis umożliwia integrację z kalendarzem programu MS Outlook. Dzięki temu użytkownik, zanim zdecyduje się zapisać na inicjatywę, może najpierw sprawdzić czy jej data nie koliduje z innymi wydarzeniami we własnym harmonogramie Outlooku.
MS Outlook od wersji 2002 obsługuje standard iCalendar (RFC 2445), który umożliwia wysyłanie zaproszeń i potwierdzeń przyjęcia zaproszenia na spotkanie, poprzez pocztę email.
Poniższy diagram przedstawia sposób działania Systemu Sprawdzania Daty w Zewnętrznym Kalendarzu MS Outlook:
Zalogowany użytkownik używając przeglądarki internetowej uzyskuje dostęp do strony konkretnej inicjatywy
Wciśnięcie przycisku „Sprawdź termin w zewnętrznym kalendarzu MS Outlook”
Serwer pobiera konkretne dane o inicjatywy z bazy danych
Tworzy specjalny email z załącznikiem formatu iCalendar z zaproszeniem na wydarzenie
Poprzez połączenie przez protokół SMTP wysyła email na serwer pocztowy
Serwer pocztowy wysyła wiadomość na adres email użytkownika
MS Outlook rozpoznaje wiadomość email jako zaproszenie na spotkanie
Użytkownik otrzymuje informację o zaproszeniu na spotkanie
Użytkownik może Zaakceptować albo Odrzucić zaproszenie
MS Outlook tworzy wiadomość email z załącznikiem formatu iCalendar z odpowiedzią na zaproszenie wydarzenia
Serwer pocztowy wysyła wiadomość na adres email serwisu Iniciatywy.pl
Serwer Iniciatywy.pl utrzymuje stałe połączenie IMAP z serwerem pocztowym i oczekuje na nowe wiadomości
W momencie otrzymania wiadomości Serwer Aplikacji prasuje ją i na podstawie jej treści podejmuje decyzje
Informacja o użytkowniku zostaje dopisana do inicjatywy
Prezentacja Portalu