==== Sformułowanie zadania projektowego: ==== Celem projektu jest niesienie pomocy osobom niepełnosprawnym. Osoby takie bardzo często z uwagi na swoje ograniczone możliwości, są pozbawione przyjemności uczestnictwa w wielu dziedzinach życia. Naszym zadaniem, a właściwie obowiązkiem wobec takich osób, jest możliwe udostępnienie pomocnych narzędzi, aby takie osoby nie czuły się ograniczone w żaden dodatkowy sposób. Z racji rozwijających się w ogromnym tempie możliwości jakie dają media (szczególnie Internet), postanowiliśmy stworzyć kompleksowy serwis, który byłby pomocny w korzystaniu z tego medium. W serwisie będą znajdowały się zarówno narzędzia jak i wszelkie potrzebne informacje na ich temat. Stwarzałby on nieograniczone możliwości dla producentów sprzętu rehabilitacyjnego, lekarzy i klinik, które mogłyby na jego łamach przedstawiać najnowsze możliwości leczenia lub niwelowania ograniczeń swoich pacjentów. Będzie to jedyne miejsce, gdzie osoby niepełnosprawne będą mogły wymieniać się uwagami oraz spostrzeżeniami na wiele tematów ze swojego życia. ==== Analiza stanu wyjściowego ==== W chwili obecnej w sieci można znaleźć podobne rozwiązania, jednak są one stworzone bardzo prowizorycznie, a ich funkcjonalność jest bardzo ograniczona. Każdy z takich serwisów, przedstawia jedynie fragment możliwości naszego serwisu, na przykład oferuje wybrane narzędzia pomocy niepełnosprawnym. Dużo, z obecnie działających rozwiązań ma charakter dodatku do bardziej rozbudowanych serwisów nie traktujących o tematyce naszego projektu (udostępnianie programów dla niepełnosprawnych w serwisie, który oferuje wszelkie rodzaje dostępnych programów). Nasz serwis byłby kompleksowym rozwiązaniem i pewnym miejscem, gdzie ludzie dotknięci przez swoje ograniczenia mogliby udać się w poszukiwaniu pomocy. W trakcie rozwoju serwisu, umożliwiłoby to zostanie liderem w tej tematyce i dalszą promocję. Niniejszym stałby się popularny i pomocny w popularyzowaniu szczególnych rozwiązań. To z pewnością przyczyniłoby się do wykorzystania wyznaczonego miejsca w serwisie na płatną promocję produktów oferowanych przez jego sponsorów. ==== Analiza wymagań użytkownika ==== * możliwość rejestracji i logowanie * przeglądanie i korzystanie ze zbiorów artykułów i narzędzi * dodawanie i edycja artykułów i narzędzi przez zarejestrowanych uzytkowników * dodawanie komentarzy przez zarejestrowanych użytkowników * przeglądanie forum * dodawanie działów i tematów na forum przez zarejestrowanych użytkowników * dodawanie postów przez zarejestrowanych uzytkowników ===== Określenie scenariuszy użycia===== - Jako niezalogowany użytkownik serwisu, chcę założyć nowe konto, aby móc się zalogować do serwisu. - Jako użytkownik serwisu, chcę przejść na listę dostępnych artykułów w wybranej kategorii, aby móc przeczytać wybrany z nich. - Jako użytkownik serwisu, chcę przejść na stronę wyszukiwarki, aby odnaleźć interesujące mnie informacje. - Jako zalogowany użytkownik serwisu, chcę zmienić swoje dane personalne, aby zaktualizować swoje dane osobowe w związku ze zmianą miejsca zamieszkania. - Jako zalogowany użytkownik serwisu, chcę wejść na forum dyskusyjne, aby rozpocząć nowy temat dyskusji. - Jako użytkownik serwisu, chcę zobaczyć listę dostępnych narzędzi wspomagania pracy z komputerem dla osób niepełnosprawnych, aby ściągnąć i zainstalować wybrany program, który najlepiej spełnia moje oczekiwania. - Jako zalogowany użytkownik serwisu, chcę wysłać wiadomość do innego użytkownika serwisu, aby uzyskać dodatkowe informacje. - Jako zalogowany użytkownik serwisu, chcę skomentować czytany przeze mnie artykuł, aby podzielić się swoim zdaniem i dodać kolejne informacje. - Jako administrator serwisu, chcę wejść na stronę serwisu, i usuwam reklamy i zbędne komentarze pozostawione przez roboty spamujące aby zachować przejrzystość serwisu. - Jako zalogowany użytkownik, chcę zgłasosić propozycję dodania do zasobów portalu nowego programu, bądź propozycji programu, aby pomóc innym użytkownikom. - Jako pracownik instytucji trzecich, chcę odnaleźć osoby potrzebujące, aby popularyzować swoją organizację charytatywną wśród grupy docelowej. =====Identyfikacja funkcji ===== Funkcje dla administratora: * Logowanie jako administrator * Modyfikowanie strony głównej * Modyfikowanie profilu użytkownika * Modyfikowanie strony Artykułu * Modyfikowanie strony Programu * Usuwanie artykułów * Usuwanie programów * Moderacja forum * Zakładanie nowych działów forum Funkcje dla użytkownika: * Logowanie jako użytkownik * Rejestracja użytkownika * Komentowanie artykułów * Komentowanie programów * Tworzenie nowych tematów na forum * Publikowanie nowych opisów programu * Publikowanie nowych Artykułów ===== Analiza hierarchii funkcji projektowanej aplikacji ===== {{:pl:dydaktyka:ztb:2010:projekty:pdon:analiza_hierarchii.png?640|}} ===== Budowa i analiza diagramu przepływu danych ===== Wybór encji (obiektów) i ich atrybutów Role id integer name string authorizable_type string authorizable_id integer created_at datetime updated_at datetime Program id integer name string platform string summary text content text tags string author_id integer creator string created_at datetime updated_at datetime href string download_href string Article id integer name string content text author_id integer created_at datetime updated_at datetime summary text type string slug string Page id integer name string content text author_id integer created_at datetime updated_at datetime summary text type string slug string User id integer email string activity_id integer fullname string nick string crypted_password string password salt string persistance_token string single_access_token string persihable_token string login_count integer failed_login_count integer last_request at datetime current_login_at datetime last_login_at datetime created_at datetime updated_at datetime is_admin boolean RoleUser id integer role_id integer user_id integer state string created_at datetime updated_at datetime DiggedSiteDigg id integer user_id integer digged_site_id integer created_at datetime updated_at datetime InternalMessage id integer sender_id integer receiver_id integer subject string parent_id integer content text xreated_at datetime updated_at datetime ForumSection id integer name string description text created_at datetime updated_at datetime Comment id integer author_id integer content string commentable_types string commentable_id string created_at datetime updated_at datetime DiggedSite id integer author_id integer href string comment text state string click_count integer created_at datetime updated_at datetime ForumPost id integer subject_id integer author_id integer content text type string created_at datetime updated_at datetime name string forum_section_id integer ForumTopic id integer subject_id integer author_id integer content text type string created_at datetime updated_at datetime name string forum_section_id integer ===== Projektowanie powiązań (relacji) pomiędzy encjami ===== {{:pl:dydaktyka:ztb:2010:projekty:pdon:graf_bazy.png?640|}}=====Projekt diagramów STD ===== **Diagram obsługi Artykułów (diagram dla Narzędzi jest analogiczny):** {{:pl:dydaktyka:ztb:2010:projekty:pdon:std1.png?640|}} **Diagram obsługi forum:** {{:pl:dydaktyka:ztb:2010:projekty:pdon:std2.png?640|}} **Projektowanie tabel, kluczy, kluczy obcych, powiązań między tabelami, indeksów, etc. w oparciu o zdefiniowany diagram ER** -- -- Table structure for table 'comments' -- CREATE TABLE IF NOT EXISTS 'comments' ( 'id' int(11) NOT NULL auto_increment, 'author_id' int(11) default NULL, 'content' varchar(255) collate utf8_unicode_ci default NULL, 'commentable_type' varchar(255) collate utf8_unicode_ci default NULL, 'commentable_id' int(11) default NULL, 'created_at' datetime default NULL, 'updated_at' datetime default NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=10 ; -- -------------------------------------------------------- -- -- Table structure for table 'digged_sites' -- CREATE TABLE IF NOT EXISTS 'digged_sites' ( 'id' int(11) NOT NULL auto_increment, 'author_id' int(11) default NULL, 'href' varchar(255) collate utf8_unicode_ci default NULL, 'comment' text collate utf8_unicode_ci, 'state' varchar(255) collate utf8_unicode_ci default NULL, 'click_count' int(11) default NULL, 'created_at' datetime default NULL, 'updated_at' datetime default NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table 'digged_site_diggs' -- CREATE TABLE IF NOT EXISTS 'digged_site_diggs' ( 'id' int(11) NOT NULL auto_increment, 'user_id' int(11) default NULL, 'digged_site_id' int(11) default NULL, 'created_at' datetime default NULL, 'updated_at' datetime default NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table 'forum_posts' -- CREATE TABLE IF NOT EXISTS 'forum_posts' ( 'id' int(11) NOT NULL auto_increment, 'subject_id' int(11) default NULL, 'author_id' int(11) default NULL, 'content' text collate utf8_unicode_ci, 'type' varchar(255) collate utf8_unicode_ci default NULL, 'created_at' datetime default NULL, 'updated_at' datetime default NULL, 'name' varchar(255) collate utf8_unicode_ci default NULL, 'forum_section_id' int(11) default NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=10 ; -- -------------------------------------------------------- -- -- Table structure for table 'forum_sections' -- CREATE TABLE IF NOT EXISTS 'forum_sections' ( 'id' int(11) NOT NULL auto_increment, 'name' varchar(255) collate utf8_unicode_ci default NULL, 'description' text collate utf8_unicode_ci, 'created_at' datetime default NULL, 'updated_at' datetime default NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ; -- -------------------------------------------------------- -- -- Table structure for table 'forum_topics' -- CREATE TABLE IF NOT EXISTS 'forum_topics' ( 'id' int(11) NOT NULL auto_increment, 'subject_id' int(11) default NULL, 'author_id' int(11) default NULL, 'content' text collate utf8_unicode_ci, 'type' varchar(255) collate utf8_unicode_ci default NULL, 'created_at' datetime default NULL, 'updated_at' datetime default NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table 'internal_messages' -- CREATE TABLE IF NOT EXISTS 'internal_messages' ( 'id' int(11) NOT NULL auto_increment, 'sender_id' int(11) default NULL, 'receiver_id' int(11) default NULL, 'subject' varchar(255) collate utf8_unicode_ci default NULL, 'parent_id' int(11) default NULL, 'content' text collate utf8_unicode_ci, 'created_at' datetime default NULL, 'updated_at' datetime default NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table 'pages' -- CREATE TABLE IF NOT EXISTS 'pages' ( 'id' int(11) NOT NULL auto_increment, 'name' varchar(255) collate utf8_unicode_ci default NULL, 'content' text collate utf8_unicode_ci, 'author_id' int(11) default NULL, 'created_at' datetime default NULL, 'updated_at' datetime default NULL, 'summary' text collate utf8_unicode_ci, 'type' varchar(255) collate utf8_unicode_ci NOT NULL default 'Page', 'slug' varchar(255) collate utf8_unicode_ci default NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=13 ; -- -------------------------------------------------------- -- -- Table structure for table 'programs' -- CREATE TABLE IF NOT EXISTS 'programs' ( 'id' int(11) NOT NULL auto_increment, 'name' varchar(255) collate utf8_unicode_ci default NULL, 'platform' varchar(255) collate utf8_unicode_ci default NULL, 'summary' text collate utf8_unicode_ci, 'content' text collate utf8_unicode_ci, 'tags' varchar(255) collate utf8_unicode_ci default NULL, 'author_id' int(11) default NULL, 'creator' varchar(255) collate utf8_unicode_ci default NULL, 'created_at' datetime default NULL, 'updated_at' datetime default NULL, 'href' varchar(255) collate utf8_unicode_ci default NULL, 'download_href' varchar(255) collate utf8_unicode_ci default NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ; -- -------------------------------------------------------- -- -- Table structure for table 'roles' -- CREATE TABLE IF NOT EXISTS 'roles' ( 'id' int(11) NOT NULL auto_increment, 'name' varchar(255) collate utf8_unicode_ci default NULL, 'authorizable_type' varchar(255) collate utf8_unicode_ci default NULL, 'authorizable_id' int(11) default NULL, 'created_at' datetime default NULL, 'updated_at' datetime default NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table 'role_users' -- CREATE TABLE IF NOT EXISTS 'role_users' ( 'id' int(11) NOT NULL auto_increment, 'role_id' int(11) default NULL, 'user_id' int(11) default NULL, 'state' varchar(255) collate utf8_unicode_ci default NULL, 'created_at' datetime default NULL, 'updated_at' datetime default NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table 'schema_migrations' -- CREATE TABLE IF NOT EXISTS 'schema_migrations' ( 'version' varchar(255) collate utf8_unicode_ci NOT NULL, UNIQUE KEY 'unique_schema_migrations' ('version') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -------------------------------------------------------- -- -- Table structure for table 'sessions' -- CREATE TABLE IF NOT EXISTS 'sessions' ( 'id' int(11) NOT NULL auto_increment, 'session_id' varchar(255) collate utf8_unicode_ci NOT NULL, 'data' text collate utf8_unicode_ci, 'created_at' datetime default NULL, 'updated_at' datetime default NULL, PRIMARY KEY ('id'), KEY 'index_sessions_on_session_id' ('session_id'), KEY 'index_sessions_on_updated_at' ('updated_at') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=20 ; -- -------------------------------------------------------- -- -- Table structure for table 'users' -- CREATE TABLE IF NOT EXISTS 'users' ( 'id' int(11) NOT NULL auto_increment, 'email' varchar(255) collate utf8_unicode_ci NOT NULL, 'activity_id' int(11) default '0', 'fullname' varchar(255) collate utf8_unicode_ci default NULL, 'nick' varchar(255) collate utf8_unicode_ci default NULL, 'crypted_password' varchar(255) collate utf8_unicode_ci NOT NULL, 'password_salt' varchar(255) collate utf8_unicode_ci NOT NULL, 'persistence_token' varchar(255) collate utf8_unicode_ci NOT NULL, 'single_access_token' varchar(255) collate utf8_unicode_ci NOT NULL, 'perishable_token' varchar(255) collate utf8_unicode_ci NOT NULL, 'login_count' int(11) NOT NULL default '0', 'failed_login_count' int(11) NOT NULL default '0', 'last_request_at' datetime default NULL, 'current_login_at' datetime default NULL, 'last_login_at' datetime default NULL, 'current_login_ip' varchar(255) collate utf8_unicode_ci default NULL, 'last_login_ip' varchar(255) collate utf8_unicode_ci default NULL, 'created_at' datetime default NULL, 'updated_at' datetime default NULL, 'is_admin' tinyint(1) default '0', PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; ===== Projektowanie operacji na danych===== Operacje na danych realizowane są przy użyciu frameworka do mapowania obiektowo-relacyjnego dla języka Ruby - ActiveRecord. Dzięki temu, operacje na danych są ekstremalnie proste, np. @resource = User.find(1) # wyszukiwanie po id @resource = Article.find_by_slug('Home') # wyszukiwanie po nazwie zawartej w adresie @resources = Article.all(:limit => 10, :offset => 10) # wyszukanie 10 rekordów z przesunięciem o 10 @resource = User.create(params[:user]) # tworzenie rekordu @resource = User.find(1).destroy # usuwanie rekordu Dodatkowo, dzięki wykorzystaniu biblioteki warstwy kontrolera InheritedResources, wyeliminowana została konieczność definiowania akcji użytkownika explicite. Zamiast tego, generowany jest zestaw metod: new index show(id) edit(id) create(id) update(id) destroy(id) Metody te same w sobie zawierają kod, który umożliwia operacje na danych. Na przykład, metoda create będzie miała następujący kształt, pomimo tego, że w kodzie kontrolera sie nie pojawi: def create @resource = RESOURCE_CLASS.new(params[RESOURCE_NAME]) # utworzenie rekordu aktywnego o zadanych parametrach if @resource.save # zapis do bazy danych # wyrenderuj widok poprawny else # wyrenderuj stronę błędu end end gdzie: * RESOURCE_CLASS to klasa warstwy modelu związana z danym kotrnolerem, np. Article * RESOURCE_NAME to nazwa zasobu używana do przekazywana parametru, np. article ===== Implementacja bazy danych ===== Baza danych została zaimplementowana na silniku mySQL w wersji 5.1. Do jej obsługi używana jest biblioteka ActiveRecord w wersji 3.0.0.beta4, będąca standardowym mechanizmem frameworku Ruby on Rails 3. * mysql: 5.0.75-0ubuntu10.5 * rubygems 1.3.6 * Ruby on Rails 3 beta 4 oraz gemy: * abstract (1.0.0) - tworzenie metod abstrakcyjnych w Ruby * actionmailer (3.0.0.beta4) - zależność dla Ruby on Rails, wysyłanie wiadomości e-mail * actionpack (3.0.0.beta4) - zależność dla Ruby on Rails, rozszerzenia Ruby * activemodel (3.0.0.beta4) - zależność dla Ruby on Rails, metaklasa silnika ORM (odpowiednik interfejsu) * activerecord (3.0.0.beta4) - zależność dla Ruby on Rails, silnik ORM * activeresource (3.0.0.beta4) - zależność dla Ruby on Rails, klient REST * activesupport (3.0.0.beta4) - zależność dla Ruby on Rails, rozszerzenia Ruby * arel (0.4.0) - zależność dla Ruby on Rails * authlogic (2.1.3 a087ad) - obsługa autentykacji użytkowników * builder (2.1.2) - zależność dla języka Markup * bundler (0.9.26) - tworzenie "paczek" gemów (środowisko gemów konfigurowalne na poziomie aplikacji, a nie systemu) * dispatcher (0.0.1) - middleware do komunikacji Ruby<->serwer www * erubis (2.6.6) - język szablonów * formtastic (1.0.0.beta 0c0a9e) - łatwy sposób tworzenia semnatycznych formularzy * haml (3.1.0 9340ac) - język szablonów * has_scope (0.5.0 0a8c58) - rozszerzenie warstwy kontrolera * i18n (0.4.1) - internacjonalizacja aplikacji * inherited_resources (1.1.2) - rozszerzenie warstwy kontrolera * mail (2.2.5) - transport e-maili * mime-types (1.16) - definiuje typy plików * polish (0.0.4 8cfbb3) - polskie tłumaczenie komunikatów aplikacji * polyglot (0.3.1) - tłumaczenia aplikacji * rack (1.1.0) - interfejs dla serwera www * rack-mount (0.6.6) - interfejs dla serwera www * rack-test (0.5.4) - interfejs dla serwera www * rails (3.0.0.beta4) - framework * railties (3.0.0.beta4) - rozszerzenia Ruby * rake (0.8.7) - odpowiednik make/Makefile w środowisku Ruby * responders (0.6.1 3af189) - dostęp do danych aplikacji w różnych formatach * thor (0.13.7) - interfejs dla serwera www * treetop (1.4.8) - język dziedzinowy do parsowania tekstu * tzinfo (0.3.22) - rozszerzenia mechanizmów związanych z obsługa dat * will_paginate (3.0.pre 60aa1c) - paginacja na warstwie widoku i kontrolera ===== Zdefiniowanie interfejsów do prezentacji, edycji i obsługi danych ===== **Rejestracja uzytkownika:** {{:pl:dydaktyka:ztb:2010:projekty:pdon:gui1.png?640|}} **Logowanie użytkownika:** {{:pl:dydaktyka:ztb:2010:projekty:pdon:gui2.png?640|}} **Dodanie/modyfikacja artykułu:** {{:pl:dydaktyka:ztb:2010:projekty:pdon:gui3.png?640|}} **Dodanie/modyfikacja programu:** {{:pl:dydaktyka:ztb:2010:projekty:pdon:gui4.png?640|}} **Dodanie komentarza:** {{:pl:dydaktyka:ztb:2010:projekty:pdon:gui5.png?640|}} **Utworzenie nowego działu na forum:** {{:pl:dydaktyka:ztb:2010:projekty:pdon:gui6.png?640|}} **Utworzenie nowego tematu na forum:** {{:pl:dydaktyka:ztb:2010:projekty:pdon:gui7.png?640|}}