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:

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

  • metodyka zwinna
  • model życia oprogramowania: przyrostowy

Wybór narzędzi

Platforma programistyczna

  • ASP.NET MVC3
  • MS Visual Web Developer 2010 Express

Baza danych

  • MS SQL Server 2008 R2

SVN

  • TortoiseSVN, hosting na Google Code

Harmonogram

Zrealizowane

  • 15.03 - utworzenie karty projektu, wstępny wybór narzędzi
  • 25.03 - stworzenie szkieletu bazy danych oraz aplikacji
  • 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

  • Etap II został przeniesiony na okres lipiec-sierpień - wynika to z licznych obowiązków, które pojawiają się w okresie sesji

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:

  1. Zalogowany użytkownik używając przeglądarki internetowej uzyskuje dostęp do strony konkretnej inicjatywy
  2. Wciśnięcie przycisku „Sprawdź termin w zewnętrznym kalendarzu MS Outlook”
  3. Serwer pobiera konkretne dane o inicjatywy z bazy danych
  4. Tworzy specjalny email z załącznikiem formatu iCalendar z zaproszeniem na wydarzenie
  5. Poprzez połączenie przez protokół SMTP wysyła email na serwer pocztowy
  6. Serwer pocztowy wysyła wiadomość na adres email użytkownika
  7. MS Outlook rozpoznaje wiadomość email jako zaproszenie na spotkanie
  8. Użytkownik otrzymuje informację o zaproszeniu na spotkanie
  9. Użytkownik może Zaakceptować albo Odrzucić zaproszenie
  10. MS Outlook tworzy wiadomość email z załącznikiem formatu iCalendar z odpowiedzią na zaproszenie wydarzenia
  11. Serwer pocztowy wysyła wiadomość na adres email serwisu Iniciatywy.pl
  12. Serwer Iniciatywy.pl utrzymuje stałe połączenie IMAP z serwerem pocztowym i oczekuje na nowe wiadomości
  13. W momencie otrzymania wiadomości Serwer Aplikacji prasuje ją i na podstawie jej treści podejmuje decyzje
  14. Informacja o użytkowniku zostaje dopisana do inicjatywy

Prezentacja Portalu

pl/dydaktyka/ztb/2012/projekty/portal_inicjatyw/start.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