Мои идеи по созданию сайта про марки
Техническая база
Сайт будет написан на Java (JSP) с использованием БД MySQL.
Устройство базы данных
CREATE DATABASE IF NOT EXISTS `stamps_site`;
USE stamps_site;
- TODO: кто изображен на марке (в отдельную таблицу?), путь к изображению с маркой/серией, признак гашености.
- stamps (таблица, описывающая каждую марку)
Название поля | Пояснения |
stamp_id | идентификатор марки |
year | год выпуска (перенести в серию?) |
country_id | страна, выпустившая марку |
michel_id | номер по Михелю |
scott_id | номер по Скотту |
gibbons_id | номер по Стэнли Гиббонсу |
imp | беззубцовка — TRUE/c зубцами — FALSE (перенести в серию?) |
SQL-запись:
CREATE TABLE IF NOT EXISTS `stamps` (
`stamp_id` INT(4) UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
`year` YEAR,
`country_id` INT(4) UNSIGNED NOT NULL,
`michel_id` INT(4) UNSIGNED,
`scott_id` INT(4) UNSIGNED ,
`gibbons_id` INT(4) UNSIGNED ,
`imp` BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY(stamp_id),
FOREIGN KEY(country_id) REFERENCES `countries`(country_id)
) ENGINE=InnoDB;
- series (таблица, описывающая серии марок)
Название поля | Пояснения |
series_id | идентификатор серии |
stamp_id | идентификатор марки, входящей в серию |
SQL-запись:
CREATE TABLE IF NOT EXISTS `series` (
`series_id` INT(4) UNSIGNED NOT NULL,
`stamp_id` INT(4) UNSIGNED NOT NULL UNIQUE,
FOREIGN KEY(stamp_id) REFERENCES `stamps`(stamp_id)
) ENGINE=InnoDB;
- countries (таблица, описывающая страны-производителей марок)
Название поля | Пояснения |
country_id | идентификатор страны |
country_name | название страны (на английском) (будет использоваться в имени файла с изображением?) |
country_url | ссылка на англоязычную википедию с описанием страны |
country_desc | краткий текст с описанием страны (может в будущем?) |
SQL-запись:
CREATE TABLE IF NOT EXISTS `countries` (
`country_id` INT(4) UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
`country_name` CHAR(255) NOT NULL UNIQUE,
`country_url` CHAR(255) NOT NULL UNIQUE,
PRIMARY KEY(country_id)
) ENGINE=InnoDB;
- users (таблица, описывающая зарегистрированных пользователей) (TODO: дополнительные поля с информацией (ICQ/Jabber/Homepage), личные настройки (показывать или нет email/ICQ/Jabber/Homepage/присылать уведомления о новых марках на сайте))
Название поля | Пояснения |
user_id | идентификатор пользователя |
user_pass | пароль пользователя (в md5) |
user_nick | ник пользователя |
user_name | полное имя пользователя |
user_email | адрес электронной почты |
SQL-запись:
CREATE TABLE IF NOT EXISTS `users` (
`user_id` INT NOT NULL,
`user_pass` NOT NULL,
`user_nick` TEXT NOT NULL,
`user_name` TEXT NOT NULL, -- may be allow NULL?
`user_email` TEXT NOT NULL -- may be allow NULL?
);
- users_collection (таблица, описывающая какие марки есть у пользователя) (TODO: добавить гашеные/нет? Может разрешить указывать марку, а не серию?)
Название поля | Пояснения |
user_id | идентификатор пользователя-владельца |
series_id | идентификатор серии |
purchase_date | дата приобретения марки |
SQL-запись:
CREATE TABLE IF NOT EXISTS `users_collection` (
`user_id` INT,
`series_id` INT,
`purchase_date` DATE
);
- clients (таблица, описывающая клиентов — продавцов/покупателей марок)
CREATE TABLE IF NOT EXISTS `clients` (
`client_id` INT NOT NULL,
`client_nick` NOT NULL TEXT,
`client_url` TEXT
);
- series_price (таблица, описывающая предложения о продаже серий марок)
CREATE TABLE IF NOT EXISTS `series_price` (
`series_id` INT NOT NULL,
`cost_ruble` DOUBLE,
`cost_dollar` DOUBLE,
`was_purchased` BOOLEAN NOT NULL,
`bid_url` TEXT NOT NULL,
`salesman_id` INT,
`buyer_id` INT NOT NULL,
`bid_date` DATE NOT NULL
);
- users_acl (таблица, описывающая права доступа пользователей сайта)
CREATE TABLE IF NOT EXISTS `users_acl` (
`user_id` INT,
`add_stamps` BOOLEAN,
`del_stamps` BOOLEAN,
`add_countries` BOOLEAN,
`del_countries` BOOLEAN,
`add_series` BOOLEAN,
`del_series` BOOLEAN,
`add_clients` BOOLEAN,
`del_clients` BOOLEAN,
`add_series_price` BOOLEAN,
`del_series_price` BOOLEAN
);
Функциональные пожелания
Пользователь должен иметь возможность узнать статистику по следующим критериям (звёздочкой (*) помечены запросы, которые доступны только зарегистрированным пользователям):
- по маркам
Запрос | SQL-запрос |
сколько всего марок в базе | SELECT COUNT(stamp_id) AS stamps_counter FROM stamps |
сколько всего марок в личной коллекции * | |
сколько ещё не приобретено * | |
сколько ещё не приобретено (в процентах) * | |
сколько негашеных марок в коллекции * | |
сколько гашеных марок в коллекции * | |
сколько марок с зубцами | SELECT COUNT(stamp_id) FROM stamps WHERE imp = FALSE |
сколько марок с зубцами (в процентах) | |
сколько беззубцовых марок | SELECT COUNT(stamp_id) FROM stamps WHERE imp = TRUE |
сколько беззубцовых марок (в процентах) | |
Запрос | SQL-запрос |
марки скольки стран есть в базе | SELECT COUNT(DISTINCT country_id) AS countries_counter FROM stamps |
марки каких стран есть в базе | SELECT DISTINCT c.country_name FROM countries AS c INNER JOIN stamps AS s ON s.country_id = c.country_id |
марки каких стран есть в коллекции * | |
сколько марок конкретной страны есть в коллекции * | |
сколько марок конкретной страны есть в коллекции (в процентах) * | |
марок каких стран нет в коллекции * | |
сколько марок конкретной страны отсутствует в коллекции * | |
сколько марок конкретной страны отсутствует в коллекции (в процентах) * | |
Запрос | SQL-запрос |
марки каких годов есть | SELECT DISTINCT year FROM stamps ORDER BY year
|
сколько марок и каких годов есть в коллекции * | |
сколько марок и каких годов нет в коллекции * | |
Путеводитель по сайту
-
Пользователь зашел на сайт (страница index/index перебрасывает на /collection/show/main). На этой странице он видит краткую статистику, вида «На данный момент в базе содержится информация о %d марках, которые составляют %d серий и выпущены %d странами, в период с %d по %d года.»
Далее приведена таблица из двух столбцов — в одном страны (ссылки ведут на /collection/show/main/country/:country), в другом года (ссылки ведут на /collection/show/main/year/:year).
С главной страницы, для зарегистрированных пользователей, доступна ссылка на страницу с описанием личной коллекции (/collection/show/mine).
- Страница, отображающая информацию о марках по странам (/collection/show/(main|user/:user)/country/:country). На странице список серий и марок, выпущенных указанной страной (ссылки на /collection/series/:series-by-id).
- Страница, отображающая информацию о марках по годам (/collection/show/(main|user/:user)/year/:year). На странице список серий и марок, выпущенных в указанном году (ссылки на /collection/series/:series-by-id).
- Страница, отображающая информацию о серии марок (/collection/series/:series-by-id). Эта страница универсальна, в независимости есть у пользователя эта серия или нет.
На странице пользователь видит всю информацию о серии: год, страна, сколько марок, изображение, номера по каталогам. Если у пользователя есть эта серия, то выводится надпись «Наличествует вашей коллекции», в противном случае ничего не выводится. (В будущем также: ссылки на конекретные марки серии, кто/где/когда/почем/продаёт(вал)). Возможно, нужно выводить список пользователей, у кого есть эта серия?
Если у пользователя нет этой серии, то выводить формочку с галочкой: «У меня есть эта серия» (возможно с подпунктами гашеная/негашеная?)
- (в будущем) Страница, отображающая информацию о конкретной марке (/collection/series/:series-by-id/stamp/:stamp-by-id). Эта страница универсальна, в независимости есть у пользователя эта марка или нет.
- Главная страница для личной коллекции (/collection/show/mine которая на самом деле является страницей /collection/show/user/:user) во многом дублирует главную страницу сайта, вот только вся информация относится не ко все базе марок, а к личной коллекции пользователя.
На этой странице пользователь видит краткую статистику, вида «На данный момент (в вашей коллекции|в коллекции пользователя %s (если смотрим чужую коллекцию)) содержится информация о %d марках, которые составляют %d серий и выпущены %d странами, в период с %d по %d года.»
Далее приведена таблица из двух столбцов — в одном страны (ссылки ведут на /collection/show/user/:user/country/:country), в другом года (ссылки ведут на /collection/show/user/:user/year/:year).
- Страница со списком, зарегистрированных пользователей и их коллекций (/users/list). Отображает всех пользователей со ссылками на их коллекции (/collection/show/user/:user).
- Страница для добавления серии марок (/series/add). Доступна только пользователям с соответствующими полномочиями.
- Страница для удаления серии марок (/series/del). Доступна только пользователям с соответствующими полномочиями.
- Страница для изменения информации о серии марок (/series/edit). Доступна только пользователям с соответствующими полномочиями.
-
Страница для добавления информации о стране-производителе марок (/countries/add). Доступна только пользователям с соответствующими полномочиями.
-
Страница для удаления информации о стране-производителе марок (/countries/del). Доступна только пользователям с соответствующими полномочиями.
- Страница для изменения информации о стране-производителе марок (/countries/edit). Доступна только пользователям с соответствующими полномочиями.
Ссылок на эту страницу нет