Создание сайта знакомств

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное образовательное учреждение высшего профессионального образования «Чувашский государственный университет им. И.Н. Ульянова»

Факультет информатики и вычислительной техники

Кафедра «Информационно-вычислительных систем»

Дисциплина «Базы данных»







Пояснительная записка

к курсовой работе






Выполнил: студент ИВТ 12-04

Константинов Д.С.

Проверил: Буланкина Е.Ю.






Чебоксары – 2006 г.

Содержание


Задание.

  1. Анализ. Предметная область.

1.1 Описание предметной области

1.2 Перечень и описание функций приложения обработки базы данных.

1.3 Перечень и описание сущностей и атрибутов базы данных.

  1. Проектирование. Нормализация базы данных. Схема данных.

2.1 Пошаговое описание нормализации базы данных (методом ER-диаграмм).

2.2 Схема данных.

2.3 Перечень и описание таблиц и их полей (с указанием типов данных и ограничений) в сводной таблице.

  1. Программная часть. Руководство программиста.

  2. Тестирование. Результаты тестирования. Набор тестовых данных, обязательно включающий в себя "критические точки", и результаты операций над ними.

  3. Сопровождение. Руководство пользователя.

Список использованной литературы

Приложение 1. Исходный текст приложения.

Задание

Необходимо провести нормализацию предметной области «Сайт знакомств» и программно реализовать, использую СУБД MySQL, язык HTML, технологии PHP и ADO, на выбор скриптовые языки VBScript или JavaScript.

1. Анализ. Предметная область


1.1 Описание предметной области


Дано описание предметной области:

Сайт знакомств

На сайте знакомств регистрируются пользователи ищут наиболие подходящих для себя пользователей и переписываются с ними. Сайт должен обеспечивать поиск претендентов по параметрам, поддерживать переписку пользователей, и рейтинг пользователей.


1.2 Перечень и описание функций приложения обработки базы данных


Описание функций базы данных

  1. Система должна обеспечивать поиск претендентов

  2. Система должна поддерживать поиск сообщений

  3. Система должна поддрживать удаление сообщений

  4. Система должна поддерживать удаление пользователя

  5. Система должна поддерживать изменение параметров пользователя

  6. Система должна обеспечивать регистрацию пользователя


1.3 Перечень и описание сущностей и атрибутов базы данных


Выделили следующие сущности:

  • Пользователи-в ней находятся данные по пользователям

  • Письма-в ней находятся данные переписки

  • Фотографии- ссылки на фото пользователей

Перечень и описание всех атрибутов базы данных «Сайт знакомств»

Таблица 1

Имя атрибута

Описание

1.

Ник

Ник пользователя

2.

Пароль

Пароль пользователя

3.

Мыло

Эл. Ящик пользователя

4.

ДатаРег

Дата регистрации

5.

ДатаРожд

Дата рождения

6.

Глав

Главная фотография

7.

КолПросм

Кол-во просмотров анкеты пользователя

8.

ВремяЗаход

Время последнего захода

9.

Муж

Пол пользователя

10.

Рейтинг

Рейтинг пользователя

11

Сообщен

Тело сообщения

12

ОтКого

От кого сообщение

13

КодФото

Уникальный код фотографии

14

ДатаПослан

Когда было послано сообщение

15

ИмяФото

Имя фотографии

16

КодПисьма

Уникальный код письма

17

Кому

Кому было послано сообщение

18

Прочит

Прчитано илинет


2. Проектирование. Нормализация базы данных. Схема данных


2.1 Пошаговое описание нормализации базы данных (методом ER-диаграмм)


Определим сущности:

  • Пользователи

  • Письма

  • Фотографии

Шаг 1. Каждый пользователь может имеет несколько писем. По этому со стороны пользователя модальность необязательно координальность много. Каждое письмо обязательно должно иметь двух пользователей. По этому со стороны переписки модальность обязательно координальность много.

Итак, получим ER-диаграмму, представленную на рис. 1:


Письма

КодПисьма


Пользователи

Nik




Рис. 1


Шаг 2. Каждый пользователь может имеет несколько фотографий. По этому со стороны пользователя модальность необязательно координальность много. Каждая фотография обязательно должно иметь только одного пользователя. По этому со стороны фотографии модальность обязательно координальность 1.

Итак, получим ER-диаграмму, представленную на рис. 2:


Пользователи

Nik

Фотографии

КодФото





Итак, получим ER-диаграмму, представленную на рис. 3:

Письма

КодПисьма


Пользователи

Nik

Имеют




Принадлежат


Фотографии

КодФото





Подробное описание нормализации каждой связи.

Шаг 1. Связь Имеют. Кардинальность связи многие ко многим. Требуются три отношения по одному для каждой сущности и одно для связи. Получим отношения:

Пользователи (Ник, Пароль, Мыло, ДатаРег, ДатаРожд, КолПросм, ВремяЗаход, Муж, Рейтинг)

Письма (КодПисьма, Сообщен, ОтКого, ДатаПослан, Кому )

ПользоватПисьма(КодПисьма, Ник)

Шаг 2. Связь Принадлежат. Кардинальность связи один ко многим и модальность со стороны М-связной сущности "обязательно". Требуются два отношения по одному для каждой сущности. При этом ключ сущности будет первичным ключом для соответствующего отношения, и ключ односвязной сущности должен быть добавлен как атрибут (внешний ключ) в отношение, отводимое для М-связной сущности.

Получим отношения:

Пользователи (Ник, Пароль, Мыло, ДатаРег, ДатаРожд, КолПросм, ВремяЗаход, Муж, Рейтинг)

Фото(КодФото, Глав, ИмяФото,Ник)


2.2 Схема данных


После нормализации получили следующие отношения:

Пользователи (Ник, Пароль, Мыло, ДатаРег, ДатаРожд, КолПросм, ВремяЗаход, Муж, Рейтинг)

Письма (КодПисьма, Сообщен, ОтКого, ДатаПослан, Кому )

ПользоватПисьма(КодПисьма, Ник)

Фото(КодФото, Глав, ИмяФото,Ник)


2.3 Перечень и описание таблиц и их полей (с указанием типов данных и ограничений) в сводной таблице


Таблица 2. Сводная таблица атрибутов и отношений базы данных «Сайт знакомств» после нормализации методом ER-диаграмм

Имя отношения (таблицы)

Имя атрибута

Имя поля

Тип д-х

Описание

Пользователи (Polzovateli)

Ник

Nik

tinitext

Ник пользователя

Пароль

Parol

tinitext

Пароль пользователя

Мыло

Milo

tinitext

Эл. Ящик пользователя

ДатаРожд

DataRozhd

date

Дата рождения пользователя

ДатаРег

DataReg

date

Дата регистр. пользователя

КолПросм

KolProsm

mediumint

Кол-во просмотров анкеты пользователя

ВремЗаход

VremZahod

datetime

Время последнего захода пользователя

Муж

Muzh

set

Пол пользователя

Рейтинг

Reiting

mediumint

Рейтинг пользователя

Письма(Soobshen)

КодПисьма

KodPisma

int

Уникальный код письма

ОтКого

OtKogo

tinytext

Чье письмо

ДатаПослан

DataPoslan

datetime

Дата послания письма

Сообщен

Sobshen

text

Тело письма

Прочит

Prochit

Set(1,0)

Прочитано или нет

Кому

Komu

tinytext

Кому письмо

Фотографии(Foto)

КодФото

KodFoto

int

Уникальный код фотографии

Ник

Nik

tinytext

Кому принадлежит фото

ИмяФото

ImaFoto

tinytext

Имя фотографии

Глав

Glav

set

Главная ли фотография

ПользоватПисьма(PolzovatPisma)

Ник

Nik

tinitext

Ник пользователя

КодПисьма

KodPisma

int

Уникальный код письма


  1. Программная часть. Руководство программиста


Сайт состоит из 7 скриптов каждый из которых выполняет определенные функции.

INDEX –с него запускается сайт содержит проверку пароля и Ника и ссылки на другие страницы включая регистрацию.

DOBAVFOTO-скрипт осуществляет добавление, удаление, и выбор главной фотографии т.е в нем осущиствлена вся работа с фотографиями

POISK-скрипт ищет претендентов на переписку по запросу пользователя

POSILKAPISEM-скрипт осуществляет отправку сообщений

PROSMOTRANKET-скрипт осуществляет просмотр своей и чужой анкеты

PROSMOTRSOBSHEN-скрипт осуществляет просмотр отправленных и принятых сообщений


REGISTRACIYA-скрипт осуществляет регистрацию пользователей

  1. Тестирование. Результаты тестирования.

Никаких сбоев при выполнении тестирования не обнаружены. Все работает исправно.

  1. Сопровождение. Руководство пользователя


Незарегестрированым пользователям не обходимо зарегестрироваться для этого необходимо перейти по ссылке «зарегестрироваться». Для зарегестрированых пользователей нужно вести свой ник и пароль и переходить по ссылкам.

Ссылки:

Поиск-осуществляет поиск пользователей

Просмотр анкеты- просмотр своей анкеты

Просмотр сообщений- просмотр отправленных и принятых сообщений

Отправка сообщений-отправка сообщений пользователям


Список использованной литературы


  1. Колисниченко Д.Н. Самоучитель PHP 5. – Издание 2-е – СПб.:Наука и Техника, 2005.

  2. Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5 на примерах. – СПб.: БХВ – Петербург, 2005.

  3. Кузнецов С.Д. PHP 4.0. Руководство пользователя. – М.: Майор, 2001.

Приложение 1. Исходный текст приложения


include_once "PodkluchaemsyaKBaze.php";

if(isset($_REQUEST['Ok']))

{

//======================Проверка на заполнение всех полей

if(($_REQUEST['adres']!=="")&&($_REQUEST['NomProekt']!=="")&&($_REQUEST['Postroen']!==""))

{

$Adres=$_REQUEST['adres'];

$NomProekt=$_REQUEST['NomProekt'];

if($_REQUEST['Postroen']==='Да')

{$Postroen=1;}

if($_REQUEST['Postroen']==='Нет')

{$Postroen=0;}

//===========================проверка на наличие в базе

$rez=mysql_query("SELECT * FROM Dom WHERE AdresDoma='".$Adres."'");

if(mysql_num_rows($rez))

{echo "<br><h3>Дом уже находиться в базеh3><br>";}

else

{

//==========================Вносим в базу

mysql_query("INSERT INTO Dom SET AdresDoma='".$Adres."', NomerProekta='".$NomProekt."', Postroika='".$Postroen."'") or die(mysql_error());

echo "

Дом добавлен

";

}

}

else

{

echo " <br><h3>Вы заполнили не все поля попробуйте ещеh3>";

}

}

include_once "PodkluchaemsyaKBaze.php";

//=====================Выводим адреса домов

$rez=mysql_query("SELECT AdresDoma FROM Dom");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

echo "";

}

?>

 

if(isset($_REQUEST['Ok']))

{

//=====================Проверка на заполнение всех полей

if(($_REQUEST['Adres']!=="")&&($_REQUEST['NomerKv']!=="")&&($_REQUEST['KolKomnat']!=="")&&($_REQUEST['Klas']!=="")&&($_REQUEST['etazh']!==""))

{

$Adres=$_REQUEST['Adres'];

$NomKv=$_REQUEST['NomerKv'];

$KolKomnat=$_REQUEST['KolKomnat'];

$Klas=$_REQUEST['Klas'];

$Etazh=$_REQUEST['etazh'];

$Ploshad=$_REQUEST['Ploshad'];

$rez=mysql_query("SELECT KodDoma FROM Dom WHERE AdresDoma='".$Adres."'");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

$KodDoma=$row['KodDoma'];

}

//=====================Проверка на наличие квартиры в базе

$rez=mysql_query("SELECT * FROM Kvartira WHERE KodDoma='".$KodDoma."' AND NomerKvartiri='".$NomKv."'");

if(mysql_num_rows($rez))

{echo "<br><h3>Квартира уже находиться в базеh3><br>";}

else

{

//=============================Вносим в базу

mysql_query("INSERT INTO Kvartira SET KodDoma='".$KodDoma."', NomerKvartiri='".$NomKv."', Metrazh='".$Ploshad."', KolichestvoKomnat='".$KolKomnat."', KlasKvartiri='".$Klas."', Etazh='".$Etazh."'") or die(mysql_error());

echo "<br><h3 color=\"black\">Квартира добавленah3>";

}

}

else

{

echo " <br><h3>Вы заполнили не все поля попробуйте ещеh3>";

}

}

include_once "PodkluchaemsyaKBaze.php";

if(isset($_REQUEST['Ok']))

{

//=====================Проверка на заполнение всех полей

if(($_REQUEST['FIO']!=="")&&($_REQUEST['Adres']!=="")&&($_REQUEST['Dolzhnost']!=="")&&($_REQUEST['Brigada']!==""))

{

$Adres=$_REQUEST['Adres'];

$FIO=$_REQUEST['FIO'];

$Dolzhnost=$_REQUEST['Dolzhnost'];

$Brigada=$_REQUEST['Brigada'];

//=====================Проверка на наличие рабочего в базе

$rez=mysql_query("SELECT * FROM Rabochiy WHERE FIORabochego='".$FIO."' AND Adres='".$Adres."'");

if(mysql_num_rows($rez))

{echo "<br><h3>Рабочий уже находиться в базеh3><br>";}

else

{

//=============================Вносим в базу

mysql_query("INSERT INTO Rabochiy SET FIORabochego='".$FIO."', Adres='".$Adres."', Dolzhnost='".$Dolzhnost."', Brigada='".$Brigada."'") or die(mysql_error());

echo "

Рабочий добавлен

";

}

}

else

{

echo " <br><h3>Вы заполнили не все поля попробуйте ещеh3>";

}

}

include_once "PodkluchaemsyaKBaze.php";

//==================Выводим адреса домов

$rez=mysql_query("SELECT AdresDoma FROM Dom");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

echo "";

}

?>

 

if(isset($_REQUEST['Ok']))

{

$Adres=$_REQUEST['Adres'];

$NomKv=$_REQUEST['NomerKv'];

$KolKomnat=$_REQUEST['KolKomnat'];

$Klas=$_REQUEST['Klas'];

$Etazh=$_REQUEST['etazh'];

$Ploshad=$_REQUEST['Ploshad'];

//=====================Создание запроса

$zap="SELECT * FROM Kvartira WHERE ";

$hren=0;

if($_REQUEST['NomerKv']!=="")

{$zap=$zap."NomerKvartiri='".$NomKv."'"; $hren=1;}

if($_REQUEST['KolKomnat']!=="")

{

if($hren===1)

{$zap=$zap." AND ";}

$zap=$zap." KolichestvoKomnat='".$KolKomnat."'";

$hren=1;

}

if($_REQUEST['Klas']!=="")

{

if($hren===1)

{$zap=$zap." AND ";}

$zap=$zap." KlasKvartiri='".$Klas."'";

$hren=1;

}

if($_REQUEST['etazh']!=="")

{

if($hren===1)

{$zap=$zap." AND ";}

$zap=$zap." Etazh='".$Etazh."'";

$hren=1;

}

if($_REQUEST['Ploshad']!=="")

{

if($hren===1)

{$zap=$zap." AND ";}

$zap=$zap." Ploshad='".$Ploshad."'";

$hren=1;

}

if($_REQUEST['Adres']!=="")

{

//==========================Ищем код дома по его адресу

$rez=mysql_query("SELECT KodDoma FROM Dom WHERE AdresDoma='".$Adres."'");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

$KodDoma=$row['KodDoma'];

}

if($hren===1)

{$zap=$zap." AND ";}

$zap=$zap." KodDoma='".$KodDoma."'";

}

//=======================Подаем созданый запрос

$rez=mysql_query($zap);

if(!mysql_num_rows($rez))

{

echo "<br><h3>По запросу ничего не найденоh3><br>";

}

else

{

//=======================Вывод результатов поиска в таблице

echo " echo "АдресКвартираПлощадьКол-во комнатКласс квартирыЭтаж";

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

//==================================Ищем адрес дома по его коду

$rezult=mysql_query("SELECT AdresDoma FROM Dom WHERE KodDoma='".$row['KodDoma']."'");

for($datas=array();$rows=mysql_fetch_assoc($rezult);$data[]=$rows)

{

$AdresDoma=$rows['AdresDoma'];

}

echo "".$AdresDoma."".$row['NomerKvartiri']."".$row['Metrazh']."".$row['KolichestvoKomnat']."".$row['KlasKvartiri']."".$row['Etazh']."";

}

echo "";

}

}


include_once "PodkluchaemsyaKBaze.php";

echo "";

echo " echo "АдресКвартираПлощадьКол-во комнатКласс квартирыЭтажВладелец";

$rez=mysql_query("SELECT * FROM Pokupka");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

$KodKlienta=$row['KodKlienta'];

$KodKvartiri=$row['KodKvartiri'];

$rez1=mysql_query("SELECT * FROM Klient WHERE KodKlienta='".$KodKlienta."'");

for($data1=array();$row1=mysql_fetch_assoc($rez1);$data1[]=$row1)

{

$FIO=$row1['FIO'];

}

$rez2=mysql_query("SELECT * FROM Kvartira WHERE KodKvartiri='".$KodKvartiri."'");

for($data2=array();$row2=mysql_fetch_assoc($rez2);$data2[]=$row2)

{

$rezult=mysql_query("SELECT AdresDoma FROM Dom WHERE KodDoma='".$row2['KodDoma']."'");

for($datas=array();$rows=mysql_fetch_assoc($rezult);$data[]=$rows)

{

$AdresDoma=$rows['AdresDoma'];

}

echo "".$AdresDoma."".$row2['NomerKvartiri']."".$row2['Metrazh']."".$row2['KolichestvoKomnat']."".$row2['KlasKvartiri']."".$row2['Etazh']."".$FIO."";

}

}

echo " ";

if(isset($_REQUEST['Ok']))

{

$data=array();

$data=$_REQUEST['ima'];

foreach ($data as $v=>$k)

{

mysql_query("DELETE FROM Pokupka WHERE KodKlienta='".$v."' AND KodKvartiri='".$k."'");

echo "<br><h3> Удалилиh3>";

}

}

//------------Начало открытии базы--------------

$user="root";

$pass="";

$db="Oleg";

mysql_connect("Oleg",$user,$pass)

or die("Could not connect: ".mysql_error());

mysql_select_db($db)

or die("Could not select database: ".mysql_error());

//-----------Конец открытию базы--------------------

//===========================Здесь пишутся(в браузере) все рабочии

include_once "PodkluchaemsyaKBaze.php";

$rez=mysql_query("SELECT FIORabochego FROM Rabochiy");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

echo "";

}

?>

//========================Здесь пишутся(в браузере) все адреса домов и квартир

$rez=mysql_query("SELECT AdresDoma, NomerKvartiri FROM Dom D ,Kvartira K WHERE D.KodDoma=K.KodDoma");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

echo "";

}

?>

if(isset($_REQUEST['Ok']))

{

$Rabochiy=$_REQUEST['Rabochiy'];

$Adres=$_REQUEST['Kvartira'];

$massiv=array();

//===============вычисляет регулярное выражение разделяет улицу и номер дома от номера квартиры

preg_match('/([a-z]+[\D][0-9.]+)@([a-z0-9.]+)/is',$Adres,$massiv);

//======================================Находим код дома

$rez=mysql_query("SELECT KodDoma FROM Dom WHERE AdresDoma='".$massiv[1]."'");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

$KodDoma=$row['KodDoma'];

}

//=======================================По коду дома на ходим код квартиры

$rez=mysql_query("SELECT KodKvartiri FROM Kvartira WHERE KodDoma='".$KodDoma."' AND NomerKvartiri='".$massiv[2]."'");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

$KodKvartiri=$row['KodKvartiri'];

}

//=======================================Находим код рабочего

$rez=mysql_query("SELECT KodRabochego FROM Rabochiy WHERE FIORabochego='".$Rabochiy."'");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

$KodRabochego=$row['KodRabochego'];

}

//===================================Закрепляем рабочего за квартирой

mysql_query("INSERT INTO Stoyka SET KodRabochego='".$KodRabochego."', KodKvartiri='".$KodKvartiri."'");

echo "

Рабочий закреплен

";

}

include_once "PodkluchaemsyaKBaze.php";

//=======================Выводим адреса домов

$rez=mysql_query("SELECT AdresDoma FROM Dom");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

echo "";

}

?>



Квартира

 

include_once "PodkluchaemsyaKBaze.php";

if(isset($_REQUEST['Ok']))

{

//======================Проверка на заполнение всех полей

if(($_REQUEST['Adres']!=="")&&($_REQUEST['Kvartira']!=="")&&($_REQUEST['FIO']!=="")&&($_REQUEST['AdrKlient']!==""))

{

$Adres=$_REQUEST['Adres'];

$Kvartira=$_REQUEST['Kvartira'];

$FIO=$_REQUEST['FIO'];

$AdrKlient=$_REQUEST['AdrKlient'];

//=============================Ищем код дома по его адресу

$rez=mysql_query("SELECT KodDoma FROM Dom WHERE AdresDoma='".$Adres."'");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

$KodDoma=$row['KodDoma'];

}

//==========================Проверяем а есть ли такая квартира

$rez=mysql_query("SELECT KodKvartiri FROM Kvartira WHERE KodDoma='".$KodDoma."' AND NomerKvartiri='".$Kvartira."'");

if(!mysql_num_rows($rez))

{

echo "<br><h3>Квартира не существует ведите данные правильноh3>";

}

else

{

//===========================Ищем код квартиры по адресу и номеру квартиры

$rez=mysql_query("SELECT KodKvartiri FROM Kvartira WHERE KodDoma='".$KodDoma."' AND NomerKvartiri='".$Kvartira."'");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

$KodKvartiri=$row['KodKvartiri'];

}

//==========================Проверка есть ли в нашей базе этот клиент если нет добовляем его

$rez=mysql_query("SELECT KodKlienta FROM Klient WHERE FIO='".$FIO."' AND AdresKlienta='".$AdrKlient."'");

if(!mysql_num_rows($rez))

{

mysql_query("INSERT INTO Klient SET FIO='".$FIO."', AdresKlienta='".$AdrKlient."'");

}

//==============================Ищем код клиента для дальнейшего ввода в базу покупка

$rez=mysql_query("SELECT KodKlienta FROM Klient WHERE FIO='".$FIO."' AND AdresKlienta='".$AdrKlient."'");

for($data=array();$row=mysql_fetch_assoc($rez);$data[]=$row)

{

$KodKlienta=$row['KodKlienta'];

}

//=========================Проверяем есть ли заявки на эту квартиру

$rez=mysql_query("SELECT KodKlienta FROM Pokupka WHERE KodKvartiri='".$KodKvartiri."'");

if(mysql_num_rows($rez))

{

echo "<br><h3>Квартира уже зОбитаh3>";

}

//=============================Если заявок нет вносим этого клиента в базу Покупка

else

{

mysql_query("INSERT INTO Pokupka SET KodKlienta='".$KodKlienta."', KodKvartiri='".$KodKvartiri."'");

echo "<br><h3>Заявка внесена в базуh3>";

}

}

}

else

{

echo "<br><h3>Заполните все поляh3>";

}

}

?>

30


Нравится материал? Поддержи автора!

Ещё документы из категории информатика:

X Код для использования на сайте:
Ширина блока px

Скопируйте этот код и вставьте себе на сайт

X

Чтобы скачать документ, порекомендуйте, пожалуйста, его своим друзьям в любой соц. сети.

После чего кнопка «СКАЧАТЬ» станет доступной!

Кнопочки находятся чуть ниже. Спасибо!

Кнопки:

Скачать документ