[[dawid.boisse@gmail.com|Dawid Boisse]], Wojciech Myśliwiec Projekt realizowano również na przedmiocie Technologie i programowanie WWW. ===== Streszczenie ===== Projekt stanowi podstawę bazodanową dla projektu realizowanego z przedmiotu Technologie i Programowanie WWW. Implementacja (w ciągłej fazie rozwoju) dostępna jest pod adresem [[http://znaczki.malopolska.pl]] ===== 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 ===== 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 ===== **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 ===== ** 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 ===== * 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 ===== {{: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 przejść stanów systemu: {{:pl:dydaktyka:ztb:2010:projekty:znaczki:state_transistion_diagram.png|}} ===== Projektowanie tabel ===== 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; ===== Normalizacja tabel ===== 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 /** * 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); Same zapytania do bazy danych były wykonywane w najprostszy sposób: /** * 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); Po wykonaniu wszystkich zapytań połączenie z bazą danych jest zawsze zamykane: /** * Zakończenie połączenia z bazą danych. */ if(!$connection) { mysql_close($connection); } /*if(!$connection)*/ ===== 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 ===== * [[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.