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
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
Projekt diagramów STD
Diagram obsługi Artykułów (diagram dla Narzędzi jest analogiczny):
Diagram obsługi forum:
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.
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:
Logowanie użytkownika:
Dodanie/modyfikacja artykułu:
Dodanie/modyfikacja programu:
Dodanie komentarza:
Utworzenie nowego działu na forum:
Utworzenie nowego tematu na forum: