Spis treści

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 Katalog znaczków pocztowych oraz serwis 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

Opcjonalne

Określenie scenariuszy użycia

Scenariusze dla gościa

Scenariusze dla użytkownika

Scenariusze dla administratora/moderatora

Diagram przypadków użycia

Identyfikacja funkcji

FHD - Diagram hierarchii funkcji

Budowa i analiza diagramu przepływu danych

Diagram kontekstowy

Diagram główny

1.Obsługa użytkownika niezarejestrowanego

2.Obsługa użytkownika zarejestrowanego

3.Obsługa administratora

Diagram STD - State Transition Diagram

Diagram przejść stanów systemu:

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 3NF.

Diagram ERD oraz wybór encji i ich atrybutów

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)

Literatura