Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
Nowa wersja
Both sides next revision
|
pl:dydaktyka:ztb:2010:projekty:znaczki:start [2010/06/27 16:41] ztb2010 |
pl:dydaktyka:ztb:2010:projekty:znaczki:start [2010/07/02 12:17] ztb2010 |
| |
===== Sforumułowanie zadania projektowego ===== | ===== Sforumułowanie zadania projektowego ===== |
| |
| Celem projektu jest stworzenie serwisu dla filatelistów, który umożliwiałby im monitorowanie nowości i zmian na polskim rynku filatelistycznym. Elektroniczne źródła informacji z rynku filatelistycznego bywają skąpe w informacje oraz często nieaktualizowane na bieżąco. Brakuje również prostej wymiany informacji pomiędzy sympatykami znaczków, bardzo istotnej przy kompletowaniu zasobów. |
| Zwieńczeniem byłaby działalność gospodarcza polegająca na okresowej subskrypcji katalogu znaczków drogą elektroniczną. |
| W obecnej chwili wymagane jest fizyczne przeszukiwanie specjalistycznych sklepów filatelistycznych, co w mniejszych miejscowościach nie jest takie trywialne. |
| |
| Wychodząc naprzeciw potrzebom, nasz portal miałby pełnić funkcję podstawowego źródła wyżej wymienionych informacji. Chcielibyśmy przy tym stworzyć szansę wzrostu popularności tego hobby poprzez ułatwienie dostępu do informacji dla potencjalnych zainteresowanych. |
| |
| Użytkownicy w serwisie będą posiadali możliwość przeglądania katalogu online (zamiast w formie papierowej), wymiany informacji poprzez forum oraz komentarze o wszelkich aspektach działalności hobbystycznej oraz docelowo zamawiania katalogu drogą elektroniczną(w przyszłości). |
| |
| Pozyskanie większej ilości odwiedzić będzie motywacją do dalszego rozwoju serwisu, pozyskania środków finansowych z odwiedzin strony oraz przyciągania nowych osób do filatelistyki w Polsce. |
| |
===== Analiza stanu wejściowego ===== | ===== Analiza stanu wejściowego ===== |
| |
| W polskim internecie istnieje niewiele rozwiązań dedykowanych filatelistom. Najbardziej popularnym jest [[http://kzp.pl|Katalog znaczków pocztowych]] oraz serwis [[http://www.filatelistyka.org/|Filatelistyka.org]]. O ile pierwszy z wymienionych wydaje się obejmować zbliżoną funkcjonalność, jednak w nieco bardziej ogólnym zakresie, o tyle drugi jest portalem generalnie traktującym o filatelistyce, a nie konkretnie ukierunkowanym na katalog znaczków w formie online. |
| Obie strony są projektami niekomercyjnymi. |
| |
===== Analiza wymagań użytkownika ===== | ===== Analiza wymagań użytkownika ===== |
| |
| **Wymagane** |
| * Rejestracja nowych użytkowników |
| * Zarządzanie kontem(przypomnienie hasła) |
| * Przeglądanie katalogu znaczków |
| * Wyszukiwanie znaczków po numerze katalogowym |
| * Widok szczegółowy znaczka, komentarze, opinie |
| * Dodawanie nowego znaczka do bazy |
| * Moderacja wpisów przez administratora/moderatora |
| * Łatwe dodawanie wpisów na stronie głównej |
| * Ciekawy layout/design, elementy pozostałe(FAQ, Regulamin) |
| |
| **Opcjonalne** |
| * Oferta okresowej subskrypcji katalogu(przyszłość) |
| * Sondy, badanie preferencji użytkowników |
| * Dodanie nieintruzywnych reklam |
| * Monitorowanie aktywności odwiedzin |
| |
| |
| |
| |
===== Określenie scenariuszy użycia ===== | ===== Określenie scenariuszy użycia ===== |
| |
| ** Scenariusze dla gościa ** |
| * Rejestracja w serwisie |
| * Przeglądanie katalogu |
| * Wyszukiwanie po numerze katalogowym |
| * Generowanie PDF ze szczegółami wpisu z katalogu |
| * Przegląd informacji o serwisie (FAQ/Regulamin/Kontakt) |
| * Wysłanie wiadomości kontaktowej |
| |
| ** Scenariusze dla użytkownika ** |
| * Logowanie/Wylogowywanie |
| * Przypomnienie hasła |
| * Dodawanie wpisu do katalogu |
| * Przeglądanie katalogu |
| * Wyszukiwanie po numerze katalogowym |
| * Generowanie PDF ze szczegółami wpisu z katalogu |
| * Dodawanie komentarzy do wpisu |
| * Przegląd informacji o serwisie (FAQ/Regulamin/Kontakt) |
| * Wysłanie wiadomości kontaktowej |
| |
| ** Scenariusze dla administratora/moderatora ** |
| * Logowanie/Wylogowywanie |
| * Dodawanie/edycja/usuwanie wiadomości na stronie głównej |
| * Zarządzanie wpisami w katalogu |
| * Dodawanie komentarzy do wpisu |
| * Weryfikacja/unieważnianie dodanych przez użytkowników wpisów |
| * Przegląd logów i statystyk |
| |
| ** Diagram przypadków użycia ** |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:use_case_diagam.png|}} |
| |
===== Identyfikacja funkcji ===== | ===== Identyfikacja funkcji ===== |
| |
| * Logowanie/wylogowywanie z serwisu |
| * Rejestracja konta użytkownika |
| * Dodawanie wpisów na stronie głównej przez administratora |
| * Dodanie/usunięcie/modyfikacja informacji o znaczkach |
| * Generowanie dokumentu PDF dla danego znaczka |
| * Moderacja (uprawnienie dla użytkownika) wpisów w bazie znaczków |
| * Backup bazy danych |
| |
===== FHD - Diagram hierarchii funkcji ===== | ===== FHD - Diagram hierarchii funkcji ===== |
===== DFD - Diagram przepływu danych ===== | |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:fhd.png|}} |
| |
| ===== Budowa i analiza diagramu przepływu danych ===== |
| |
| === Diagram kontekstowy === |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:diagram_kontekstowy.png|}} |
| |
| === Diagram główny === |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:diagram_glowny.png|}} |
| |
| == 1.Obsługa użytkownika niezarejestrowanego == |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:uzytkownik_niezarejestrowany_dfd.png|}} |
| |
| == 2.Obsługa użytkownika zarejestrowanego == |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:uzytkownik_zarejestrowany_dfd.png|}} |
| |
| == 3.Obsługa administratora == |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:administratror_dfd.png|}} |
===== Diagram STD - State Transition Diagram ===== | ===== Diagram STD - State Transition Diagram ===== |
| |
| Diagram przejść stanów systemu: |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:state_transistion_diagram.png|}} |
| |
===== Projektowanie tabel ===== | ===== Projektowanie tabel ===== |
| |
| <code sql> |
| CREATE TABLE IF NOT EXISTS `admin` ( |
| `admin_name` varchar(20) CHARACTER SET utf8 NOT NULL, |
| `admin_pass` varchar(32) CHARACTER SET utf8 NOT NULL, |
| `admin_email` varchar(60) CHARACTER SET utf8 NOT NULL |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; |
| |
| CREATE TABLE IF NOT EXISTS `users` ( |
| `user_name` varchar(20) CHARACTER SET utf8 NOT NULL, |
| `user_pass` varchar(32) CHARACTER SET utf8 NOT NULL, |
| `user_email` varchar(60) CHARACTER SET utf8 NOT NULL |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; |
| |
| CREATE TABLE IF NOT EXISTS `users_not_confirmed` ( |
| `users_not_confirmed_name` varchar(20) NOT NULL, |
| `users_not_confirmed_pass` varchar(32) NOT NULL, |
| `users_not_confirmed_email` varchar(60) NOT NULL |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
| |
| CREATE TABLE IF NOT EXISTS `main_page_info` ( |
| `main_page_info_title` varchar(30) CHARACTER SET utf8 NOT NULL, |
| `main_page_info_msg` varchar(2048) CHARACTER SET utf8 NOT NULL, |
| `main_page_info_user` varchar(20) CHARACTER SET utf8 NOT NULL, |
| `main_page_info_date` date NOT NULL, |
| `main_page_info_time` time NOT NULL |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; |
| |
| CREATE TABLE IF NOT EXISTS `poststamps` ( |
| `poststamp_id` int(4) NOT NULL, |
| `poststamp_title` varchar(256) CHARACTER SET utf8 NOT NULL, |
| `poststamp_price` float NOT NULL, |
| `poststamp_print_tech` varchar(32) CHARACTER SET utf8 NOT NULL, |
| `poststamp_tooth` varchar(11) CHARACTER SET utf8 NOT NULL, |
| `poststamp_color` varchar(32) CHARACTER SET utf8 NOT NULL, |
| `poststamp_amount` int(10) NOT NULL, |
| `poststamp_release` date NOT NULL, |
| `poststamp_additional` varchar(2048) CHARACTER SET utf8 NOT NULL, |
| `poststamp_user` varchar(20) CHARACTER SET utf8 NOT NULL, |
| `poststamp_date` date NOT NULL, |
| `poststamp_time` time NOT NULL, |
| `poststamp_checked` tinyint(1) NOT NULL |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; |
| |
| CREATE TABLE IF NOT EXISTS `stamps_comments` ( |
| `stamp_comment_title` varchar(30) NOT NULL, |
| `stamp_comment_stampid` int(4) NOT NULL, |
| `stamp_comment_user` varchar(20) NOT NULL, |
| `stamp_comment_date` date NOT NULL, |
| `stamp_comment_time` time NOT NULL, |
| `stamp_comment_msg` varchar(8192) NOT NULL |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
| </code> |
| |
===== Normalizacja tabel ===== | ===== Normalizacja tabel ===== |
===== Wybór Encji i ich atrybutów ===== | |
===== Diagram ERD ===== | Wydaje się, że baza danych spełnia założenia [[http://pl.wikipedia.org/wiki/Posta%C4%87_normalna_%28bazy_danych%29|3NF]]. |
| |
| * Relacja jest w pierwszej postaci normalnej, jeśli wartości atrybutów są elementarne (atomowe, niepodzielne) - są to pojedyncze wartości określonego typu, a nie zbiory wartości. Tabela reprezentująca tę relację nie zawiera powtarzających się grup informacji. Każda kolumna jest wartością skalarną (atomową), a nie macierzą lub listą czy też czymkolwiek, co posiada własną strukturę. |
| * Relacja jest w drugiej postaci normalnej wtedy i tylko wtedy gdy jest w I postaci normalnej i każda kolumna zależy funkcyjnie od całego klucza głównego (a nie np. od części klucza). |
| * Mamy z nią do czynienia wtedy i tylko wtedy, gdy tabela jest w 2NF oraz gdy wszystkie pola nie będące polami klucza głównego są od niego zależne bezpośrednio. |
| |
| |
| |
| ===== Diagram ERD oraz wybór encji i ich atrybutów ===== |
| |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:erd_znaczki.png|ERD dla portalu o znaczkach}} |
| |
| ===== Projektowanie operacji na danych ===== |
| |
| Do połączenia z bazą danych korzystaliśmy z prostej funkcji PHP, dla której wcześniej zdefiniowaliśmy parametry do łączenia z bazą danych |
| <code php> |
| /** |
| * Dane do łączenia z bazą danych. Jest to także miejsce, gdzie należy je zmienić, by portal łączył się |
| * z naszą bazą danych. |
| * |
| * @param hostname nazwa hosa, gdzie znajduje się baza danych |
| * @param username nazwa użytkownika, który łączy się z bazą |
| * @param password hasło do bazy danych |
| * @param database baza danych |
| */ |
| $hostname = "host"; |
| $username = "uzytkownik"; |
| $password = "haslo"; |
| $database = "baza"; |
| |
| |
| /** |
| * Połączenie z bazą danych. |
| */ |
| $connection = mysql_connect($host,$db_user,$db_pass); |
| mysql_select_db($db); |
| </code> |
| Same zapytania do bazy danych były wykonywane w najprostszy sposób: |
| <code php> |
| /** |
| * Dodawanie przez administratora informacji na stronie głównej portalu. |
| */ |
| $title = addslashes($POST['mainpagetopic']); |
| $msg = addslashes($POST['mainpagemsg']); |
| $user = $SESSION['login']; |
| $mysqlquery = "INSERT INTO `$database`.`main_page_info` (`main_page_info_title`, `main_page_info_msg`, `main_page_info_user`, `main_page_info_date`, `main_page_info_time`) VALUES ('$title', '$msg', '$user', CURDATE(), NOW());"; |
| mysql_query($mysqlquery); |
| |
| |
| /** |
| * Wypisywanie na stronie głównej informacji od administracji. |
| */ |
| $mysqlquery = "SELECT * FROM `main_page_info` ORDER BY `main_page_info_date` DESC, `main_page_info_time` DESC"; |
| $result = mysql_query($mysqlquery); |
| |
| |
| /** |
| * Wprowadzanie informacji o znaczku do bazy (dodawnie nowego znaczka oraz modyfikacja istniejącego). |
| */ |
| $postid = addslashes($POST['postid']); |
| $posttitle = addslashes($POST['posttitle']); |
| $postprice = str_replace(",", ".", addslashes($POST['postprice'])); |
| $postprinttech = addslashes($POST['postprinttech']); |
| $posttooth = addslashes($POST['posttooth']); |
| $postcolor = addslashes($POST['postcolor']); |
| $postamount = addslashes($POST['postamount']); |
| $postreleasedate = addslashes($POST['postreleasedate']); |
| $postadditional = ($POST['postadditional'] == "Dodatkowe informacje") ? "" : addslashes($POST['postadditional']); |
| $user = $SESSION['login']; |
| $checked = (checkIfAdmin($SESSION['login'], $SESSION['pass'])) ? 1 : 0 ; |
| $mysqlquery = "INSERT INTO `$database`.`poststamps` (`poststamp_id`, `poststamp_title`, `poststamp_price`, `poststamp_print_tech`, `poststamp_tooth`, `poststamp_color`, `poststamp_amount`, `poststamp_release`, `poststamp_additional`, `poststamp_user`, `poststamp_date`, `poststamp_time`, `poststamp_checked`) VALUES ('$postid', '$posttitle', '$postprice', '$postprinttech', '$posttooth', '$postcolor', '$postamount', '$postreleasedate', '$postadditional', '$user', CURDATE(), NOW(), $checked);"; |
| mysql_query($mysqlquery); |
| |
| |
| /** |
| * Akceptacja/unieważnienie przez administratowa znaczka (zielona/czerwona ramka znaczka, świadcząca o jego wiarygodności). |
| */ |
| $postid = addslashes($GET['postnr']); |
| $checked = ($GET['checked'] == "true") ? 1 : 0; |
| $mysqlquery = "UPDATE `$database`.`poststamps` SET `poststamp_checked` = $checked WHERE `poststamp_id` = $postid;"; |
| mysql_query($mysqlquery); |
| |
| |
| /** |
| * Wyciąganie informacji o konkretnym znaczku. |
| */ |
| $mysqlquery = "SELECT * FROM `poststamps` WHERE `poststamp_id` = $postnr"; |
| $result = mysql_query($mysqlquery); |
| </code> |
| Po wykonaniu wszystkich zapytań połączenie z bazą danych jest zawsze zamykane: |
| <code php> |
| /** |
| * Zakończenie połączenia z bazą danych. |
| */ |
| if(!$connection) { |
| mysql_close($connection); |
| } /*if(!$connection)*/ |
| </code> |
===== Implementacja (screeny, platforma, interfejsy, uzytkowanie, przyszłośc) ===== | ===== Implementacja (screeny, platforma, interfejsy, uzytkowanie, przyszłośc) ===== |
| |
| * Strona główna |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:znaczek_01.png?200}} |
| * Dodawanie informacji na stronie głównej |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:znaczek_02.png?200}} |
| * Katalog znaczków - strona informacyjna |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:znaczek_03.png?200}} |
| * Katalog znaczków - informacje o znaczku |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:znaczek_04.png?200}} |
| * Katalog znaczków - dodawanie informacji o znaczku |
| {{:pl:dydaktyka:ztb:2010:projekty:znaczki:znaczek_05.png?200}} |
| |
===== Literatura ===== | ===== Literatura ===== |
| |
| * [[http://www.databaseanswers.org/data_models/|Database Answers]] |
| * [[http://pl.wikipedia.org/wiki/Posta%C4%87_normalna_%28bazy_danych%29|Postać normalna (Wikipedia)]] |
| * William Kent, "A Simple Guide to Five Normal Forms in Relational Database Theory", Communications of the ACM 26(2), Feb. 1983, 120-125. |