Web-система продажи поздравительных открыток

Особенности и сущность электронной коммерции. Цели и задачи создания web-системы продажи поздравительных открыток. Разработка электронного магазина на базе web-сервера Apache, языка серверных сценариев PHP и системы управления базами данных MySQL.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 09.09.2015
Размер файла 3,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Федеральное агентство по образованию Российской Федерации

Государственное образовательное учреждение

высшего профессионального образования

«КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»

Кафедра информационных технологий

КУРСОВАЯ РАБОТА

WEB-СИСТЕМА ПРОДАЖИ ПОЗДРАВИТЕЛЬНЫХ ОТКРЫТОК

Работу выполнила

студентка 4 курса

Н.А.Щигарева

Краснодар 2013

СОДЕРЖАНИЕ

  • Введение
  • 1. Области электронной коммерции
  • 2. Реализация электронного магазина
  • 2.1 Разработка архитектуры электронного магазина
  • 2.2 Разработка структуры баз данных3
  • 2.3 Создание БД в MySQL
  • 2.4 О языке серверных сценариев PHP
  • 2.5 Разработка шаблонов и главной страницы
    • 3.6 Разработка витрины электронного магазина
    • 2.7 Передача данных от браузера серверу
    • 2.7 Просмотр списка открыток
    • 2.7 Разработка корзины покупателя
    • 2.10 Просмотр корзины
      • 2.11 Добавление товара в корзину
      • 2.12 Уменьшение и увеличение количества
  • 2.13 Удаление товаров из корзины
    • 2.14 Регистрация и авторизация
  • 2.15 Сессии
  • 2.16 Авторизация
  • 2.17 Разработка системы заказа
  • 3. Пакет Denwer
  • Список использованных источников

ВВЕДЕНИЕ

Сегодня, в век информационных технологий, люди так мало уделяют времени для общения с близкими, редко дарят подарки, сделанные собственными руками. Поэтому я решила сделать не просто коммерческий сайт, а сайт, который помог бы людям уделить больше внимания своим близким. Я подумала, что делать маленькие сюрпризы, сделанные своими руками особенно приятно, потому что в них вкладываешь частичку души. Поэтому основные товары моего сайта - товары для скрапбукинга. Скрапбукинг - вид рукоделия, который заключается в изготовлении открыток, семейных фотоальбомов, фоторамок, календарей и подобных вещей. В процессе создания такого подарка получаешь огромное удовольствие от творческого процесса, не говоря уже о том, как приятно дарить подарок, сделанный своими руками!

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

Кроме того, есть возможность заказать открытку по вашему вкусу, описав что бы вы хотели видеть на ней.

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

1. ОБЛАСТИ ЭЛЕКТРОННОЙ КОММЕРЦИИ

В узком смысле электронную коммерцию обычно представляют себе просто как торговлю через Интернет. В самом широком смысле электронную коммерцию следует понимать как электронный бизнес, т.е., любой вид деятельности, в той или иной степени использующий информационные системы и глобальные сети передачи данных. Но так или иначе, электронные магазины - это то, с чего начала развиваться электронная коммерция.

Информационные технологии все увереннее обосновываются в экономическом секторе. Продажи и покупки через интернет доступны каждому, кто имеет доступ к сетевым ресурсам. Традиционный бизнес оценил те преимущества, которые открывают перед ним схемы онлайн: отсутствие территориальных рамок и расширение рынка сбыта, возможность отказаться от содержания офисов и магазинов, проводить несколько десятков сделок одновременно, работать круглосуточно и существенно экономить на оплате труда наемных работников.

Своим рождением первые системы и методы электронной коммерции обязаны появлению технологий автоматизации продаж и внедрению автоматизированных систем управления корпоративными ресурсами. В 1960 американские компании American Airlines и IBM приступают к созданию системы автоматизации процедуры резервирования мест на авиарейсы. Таким образом, система SABRE (Semi-Automatic Business Research Environment) делает воздушные перелёты более доступными для рядовых пассажиров, помогая им ориентироваться в тарифах и рейсах, число которых постоянно растет. За счёт автоматизации процесса расчёта тарифов при резервировании мест снижается стоимость услуг. Это являет собой самый первый опыт создания системы электронной коммерции.

Наиболее динамично рынок электронной коммерции развивается в течение последних 20 лет, что обусловлено стремительным ростом количества интернет-пользователей, увеличением влияния социальных сетей и других интерактивных онлайн платформ, динамичным развитием систем электронных платежей. электронный открытка магазин web

По данным агентства Invesp.com, в 2011 году объем продаж в сфере электронной коммерции в мире составляет 680,6$ млрд долларов США. По прогнозам этого агентства, данная сумма будет только расти, и к 2015 году достигнет отметки в 1,5 трлн. долларов США.

По данным исследовательского агентства Data Insight, в 2010 году ожидался объем российского рынка электронной коммерции в 240 млрд рублей. Таким образом, на долю онлайн-продаж составляет 1,6 % от общего объема продаж всей российской розницы (в среднем по ЕС этот показатель составляет 5,7 %, а в США -- 6,4 %). По отдельным товарным группам картина несколько иная. В частности, через Интернет продаётся, около 12-14% бытовой техники, электроники и книг.

На 2011 год в России насчитывалось порядка 30 000 интернет-магазинов, большая часть из которых находится в регионах страны. По статистике, за год в России закрывается порядка 10% интернет-магазинов, но вместо них открывается 20-30% новых. Сам рынок электронной коммерции в РФ прогнозирует свой рост в 2 раза за ближайшие четыре года.

Одной из самых быстроразвивающихся областей электронной коммерции является хостинг (от английского слова host - сервер), то есть услуги по размещению информации во Всемирной паутине. Хостинг включает в себя предоставление дискового пространства для размещения Web-сайтов на Web-сервере, предоставления доступа к ним по каналу связи с определенной пропускной способностью, а также прав администрирования сайта.

Важной составляющей электронной коммерции является информационно-рекламная деятельность. Многие фирмы размещают на своих Web-сайтах в Интернете важную для потребителя информацию (описание товаров и услуг, их стоимость, адрес фирмы, телефон и e-mail, по которым можно сделать заказ, и др.). Существуют специализированные серверы, предоставляющие потребителю систематизированную (по видам товара, производителям, ценам и др.) информацию об определенной группе товаров. Например, на сервере www.newman.ru содержится информация о ценах на все виды компьютерного оборудования, которые предлагают различные фирмы в Москве.

Реклама в Интернете реализуется с помощью баннеров (от английского слова "banner" - "рекламный заголовок"). В Интернете баннер представляет собой небольшую прямоугольную картинку, на которой размещается реклама Web-сайта или Web-страницы.

Баннеры могут быть как статическими (показывается одна и та же картинка), так и динамическими (картинки постоянно меняются). Щелчок по баннеру мышью приводит к переходу на соответствующий сайт или страницу, где можно более подробно узнать о том, что рекламирует баннер.

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

Широкое распространение в Интернете получила электронная торговля. Простейшим ее вариантом является виртуальная "барахолка" (доска объявлений), где продавцы и покупатели просто обмениваются информацией о предлагаемом товаре (аналог газеты "Из рук в руки").

Интересной формой электронной торговли являются Интернет-аукционы. На такие аукционы выставляются самые разные товары: произведения искусства, компьютерная техника, автомобили и так далее.

Самой удобной для покупателя формой электронной торговли являются интернет магазины. В российском Интернете существуют уже сотни магазинов, в которых можно купить все: компьютеры и программы, книги и CD, продукты питания и др.

Покупатель в Интернет-магазине имеет возможность ознакомиться с товаром (техническими характеристиками, внешним видом товара и так далее), а также его ценой. Выбрав товар, потребитель может сделать непосредственно из Интернета заказ на его покупку, в котором указывается форма оплаты, время и место доставки и так далее. Оплата производится либо наличными деньгами после доставки товара, либо по кредитным карточкам.

В последнее время для расчетов через Интернет стали использоваться цифровые деньги. Покупатель перечисляет опреленную сумму обычных денег в банк, а взамен получает определенную сумму цифровых денег, которые существуют только в электронном виде и хранятся в "кошельке" (с использованием специальной программы) на компьютере покупателя. При расчетах через Интернет цифровые деньги поступают к продавцу, который переводит их в банк, а взамен получает обычные деньги.

2. РЕАЛИЗАЦИЯ ЭЛЕКТРОННОГО МАГАЗИНА

2.1 Разработка архитектуры электронного магазина

Разработка любого проекта начинается с формулировки требований. Итак, сформулируем в произвольной форме постановку нашей задачи.

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

Открытки должны быть сгруппированы по двум признакам - по событию и по стилю открытки. Для каждой открытки должна быть представлена информация о названии, размере, цене, а также внешний вид.

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

Перед тем как оформить заказ, покупатель должен зарегистрироваться, т.е., заполнить форму с личной информацией. Эта форма должна содержать фамилию, имя, адрес, электронный адрес, логин и пароль. Предполагается, что логины являются уникальными. Информация о зарегистрированных покупателях хранится, и при следующем посещении магазина покупателю будет достаточно только авторизоваться, т.е., набрать свой логин и пароль.

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

Таким образом, в нашем электронном магазине предполагается единственный тип пользователей - покупатель. Общую архитектуру сайта представим на рисунке 1, где отражены основные режимы работы пользователя:

рис.1 Архитектура сайта. Основные режимы работы

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

При просмотре каталога рядом с каждой открыткой должна быть гиперссылка или кнопка "Положить в корзину". При щелчке на ней открытка добавляется в корзину и на экран выдается состав корзины. В корзине рядом с каждой книгой выводится ее количество и кнопки или гиперссылки с надписями "Увеличить количество", "Уменьшить количество" и "Удалить". Кроме того, должна быть гиперссылка "Очистить корзину". После выполнения действий с корзиной происходит автоматический возврат в режим просмотра корзины - на схеме это изображено пунктирными стрелками.

Рис2. Работа с корзиной

К работе с заказом можно перейти как из главного меню, так и из корзины. При этом на экран выдается состав заказа (уже без возможности редактирования) и имеется кнопка или гиперссылка "Оформить заказ".

Рис3. Работа с заказом

Для регистрации новых покупателей из главного меню можно вызвать форму регистрации.

После заполнения полей формы должна быть произведена проверка правильности - все ли обязательные поля заполнены, нет ли уже в базе данных пользователя с таким логином, и т.п. В случае неверно введенных данных пользователю следует выдать сообщение и снова вывести на экран форму (возможно, уже частично заполненную).

Рис4. Регистрация

Для пользователей, которые уже зарегистрированы в нашем магазине, должна быть предусмотрена возможность авторизации, т.е., входа в магазин по логину и паролю. Если введены неверный логин и/или пароль, следует сообщить об этом. Если логин и пароль верные, пользователю следует вывести на экран его данные (ФИО, адрес, e-mail и т.п.) для возможной корректировки, а также список его предыдущих заказов.

Рис5. Авторизация

Главная страница нашего электронного магазина может иметь примерно такой вид:

Рис6. Главная страница

HTML-код этой страницы выглядит таким образом:

<html>

<head>

<title>GREETING CARDS SHOP</title>

</head>

<body background="images/bg.jpg">

<table border="0" align="center" width="1000">

<tr><td><table border="0" align="center" width="1000">

<tr><td colspan="4" align="center"><img src="images/headerimg.png"></td>

<td><form action="auto.phtml" method="post">

<table>

<tr><td align="right"><font size=-2>username:</font></td>

<td align="left"><input type=text style="width:80; height:20;" name=login></td></tr>

<tr><td align="right"><font size=-2>password:</font></td>

<td align="left"><input type=password style="width:80;height:20;" name=pass><input type=submit value=enter style="height:20;"></td></tr>

</table>

</td>

</form></td>

</tr>

<tr><td class="mainmenu"><a href="catalog.phtml"><b>Catalogue</b></a></td>

<td class="mainmenu"><a href="basket.phtml"><b>Shopping Cart</b></a></td>

<td class="mainmenu"><a href="reg.phtml"><b>Registration</b></a></td>

<td class="mainmenu"><a href="order.phtml"><b>Order</b></a></td>

<td class="mainmenu"><a href="exit.phtml"><b>Exit</b></a></td>

</tr>

<tr><td colspan="5"><img src="images/bigpic.jpg"> </td></tr>

</table>

</td></tr>

</td></tr>

<tr><td align="center" bgcolor="#FFA500"><font face="Arial"

size="+2"><i>Welcome!</i></font><br>

</td></tr>

<tr><td>

<center><h2><font color="#000000"><br>From cards with classic designs to modern pop-ups, lenticulars & laser-cuts, every design in our greeting card assortment has a dash of flair. Browse a variety of styles such as sweet whimsy, women's fashion, children's illustrations, black-and-white photography, vintage botanical, abstract paisley, damask patterns & much more.</font></h2></center>

</td></tr>

<tr><td><center><br>

<tr><td><center><br>

<a href="index.html"><img src="images/tomainpage.png"></a></center></td></tr>

</table>

</body>

</html>

2.2 Разработка структуры базы данных

ER-модель.

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

Центральным объектом в нашей модели данных является товар(открытки). Каждая открытка, кроме простых атрибутов, характеризуется связями с объектами событие и стиль. Тип связей - "многие к одному". Для каждого потенциального покупателя создается анонимный объект корзина, который характеризуется только уникальным номером. Между объектом корзина и объектом товар существует связь "многие ко многим",

Рис7. Модель базы данных

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

У каждого заказа имеется дата, способ доставки и владелец заказа. Таким образом, объект покупатель связан с заказом связью "один ко многим". С каждым заказом покупатель может согласиться на доставку бесплатного каталога - сохраним эту информацию в свойстве «бонус». При регистрации покупатель сообщает информацию о себе, а также может подписаться на одну из почтовых рассылок - предусмотрим для этого атрибут «рассылка».

Реляционная модель

Преобразуем ER-модель в реляционную модель. Получим следующие таблицы.

Товар(НомТов, НазТов, Размер, Цена, Вид, НомСт, НомСоб) - столбец НомТов будет внешним ключом для таблиц СоставКорзины и СоставЗаказа.

Стиль(НомСт, НазСт) - столбец НомСт является внешним ключом для таблицы Товар.

Событие(НомСоб, НазСоб) - столбец НомСоб является внешним ключом для таблицы Товар.

СоставКорзины(НомКорз, НомТов, Колво, ДатаКорз) - отдельную таблицу Корзина не создаем. т.к., у объекта Корзина нет ничего, кроме идентификатора.

Заказ(НомЗак, ДатаЗак, Доставка, Бонус) столбец НомЗак является внешним ключом для таблицы СоставЗаказа.

СоставЗаказа(НомЗак, НомТов, Колво)

Покупатель(НомПок, Фамилия, Имя, Адрес, E-mail, Логин, Пароль, Рассылка)

2.3 Создание БД в MySQL

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

create database cards;

use cards;

create table style

( id_st int(5) primary key auto_increment,

name_st varchar(50));

create table categories

( id_cat int(5) primary key auto_increment,

name_cat varchar(50));

create table cards

( id_card int(5) primary key auto_increment,

name_card varchar(100),

id_st int(5),

id_cat int(5),

size varchar(50),

price int(4),

dat int(4),

image varchar(50)

);

create table basket_cards

( id_bask char(15),

id_card int(5),

kolvo int(2),

date_bask date);

create table customers

( id_cust int(5) primary key auto_increment,

fam varchar(30),

im varchar(30),

addr varchar(100),

mail varchar(30),

login varchar(10),

pass varchar(10),

subscribe int(1));

create table orders

( id_order char(15),

date_ord date,

id_cust int(5),

dostavka int(1),

bonus int(5));

create table order_cards

( id_order char(15),

id_card int(5),

kolvo int(2));

2.4 О языке серверных сценариев PHP

Годом рождения PHP можно считать 1995 год, когда независимый программист Расмус Лердорф написал скрипт для подсчета количества посетителей страницы со своим онлайновым резюме. Тот первый скрипт был написан на языке Perl, а так как средств для разработки Internet-приложений тогда было немного, то он вызвал живой интерес программистов и пользователей со всего мира. Сначала Лердорф назвал свою программу Personal Home Page, а в дальнейшем, когда ее функции вышли далеко за пределы простого оформления домашней страницы, эту аббревиатуру стали расшифровывать рекурсивно, как PHP Hypertext Processor. Вскоре появилась версия PHP 2.0, написанная на C. В разработке версии 3.0 уже участвовала целая команда авторов. Сейчас PHP - это не только язык серверных web-сценариев, но и творческое сообщество единомышленников, работающих над развитием своего программного продукта, который завоевал признание во всем мире. По сведениям NETCRAFT (http://www.netcraft.com) PHP используется на более чем 1 000 000 хостов. Этот язык, вобравший в себя лучшие черты Perl, С, Java, создавался специально для web-приложений и получился очень удачным - лаконичным, простым, эффективным и надежным. Рассматриваемая в пособии версия 4.0 содержит такие возможности, как динамическое создание изображений, работу с PDF-файлами, поддержку многих форматов баз данных, интеграцию с XML, использование электронных платежных систем и т.п. Существенным преимуществом языка PHP является тот факт, что в пределах одного web-документа можно перемешивать HTML-тэги и PHP-команды. Для того чтобы отделить PHP-код от HTML-тэгов, его ограничивают символами <? ?>. Работает все это так. Сначала на сервере выполняются PHP-команды. Они могут содержать обращение к базам данных, работу с файлами и прочие виды обработки информации. Очень удобными являются команды print и echo, которые выполняют печать непосредственно в HTML-документ. После того как документ полностью обработан на сервере, он отправляется пользователю и отображается у него в браузере. Таким образом, пользователь никаких серверных команд уже не увидит - он увидит только результаты их работы.

2.5 Разработка шаблонов и главной страницы

Шаблоном, применительно к web-программированию, можно назвать часть web-документа, которая используется в нескольких страницах. Шаблоны позволяют быстро проводить модификацию всего сайта - достаточно изменить информацию или оформление в шаблоне, и это отразится на всех страницах, использующих данный шаблон. Для включения текста шаблона в документ используются функции include и require.

include (string имя_файла) включает содержимое файла в сценарий.

include_once (string имя_файла) включает содержимое файла в сценарий только один раз на протяжении сценария.

Если файл уже был включен, то повторное включение игнорируется.

Аналогично require(string имя_файла) и require_once (string имя_файла)

Обычно в отдельный шаблон удобно выделить шапку страницы, а в другой шаблон - нижний колонтитул или средства навигации.

Проанализируем, какие элементы оформления в нашем электронном магазине обязательно будут появляться на каждой странице.

К верхнему шаблону можно отнести фоновый рисунок, логотип вместе с маленькой формой для авторизации, а также строку меню. Обратите внимание, что заголовок текущего режима работы - "Welcome!", "Cataloque", "Shopping cart" и.т.п., также можно вынести в шаблон. Для этого заведем PHP-переменную $title, которую будем инициализировать в соответствующих страницах, а распечатывать - в верхнем шаблоне.

Итак, верхний шаблон header.phtml будет выглядеть следующим образом

<html>

<head>

<title>GREETING CARDS SHOP</title>

</head>

<body background="images/bg.jpg">

<table border="0" align="center" width="1000" cellpadding="0"

cellspacing="0">

<tr><td>

<table border="0" align="center" width="1000" >

<tr><td colspan="4" align="center"> <img src="images/headerimg.png"></td>

<td> <form action="auto.phtml" method="post">

<table>

<tr><td align="right"><font size=-2>username:</font></td>

<td align="left"><input type=text style="width:80; height:20;" name=login></td></tr>

<tr><td align="right"><font size=-2>password:</font></td>

<td align="left"><input type=password style="width:80;height:20;" name=pass><input type=submit value=enter style="height:20;"></td></tr>

</table>

</td>

</form></td>

</tr>

<tr><td><a href="catalog.phtml"><b>Catalogue</b></a></td>

<td><a href="basket.phtml"><b>Shopping Cart</b></a></td>

<td><a href="reg.phtml"><b>Registration</b></a></td>

<td><a href="order.phtml"><b>Order</b></a></td>

<td><a href="exit.phtml"><b>Exit</b></a></td>

</tr>

<tr><td colspan="5"><img src="images/bigpic.jpg"> </td></tr>

</table>

</td></tr>

<tr><td align="center" bgcolor=<?print $color?>><font face="Arial"

size="+2"><i><?print $title?></i></font><br>

</td></tr>

В нижний шаблон footer.phtml вынесем гиперссылку "На главную страницу" и закрывающие тэги документа.

<tr><td><center><br>

<a href="index.html"><img src="images/tomainpage.png"></a></center></td></tr>

</table>

</body>

</html>

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

<?

$title="Welcome!";

include("header.phtml");

?>

<tr><td>

<center><h2><br>From cards with classic designs to modern pop-ups, lenticulars & laser-cuts, every design in our greeting card assortment has a dash of flair. Browse a variety of styles such as sweet whimsy, women's fashion, children's illustrations, black-and-white photography, vintage botanical, abstract paisley, damask patterns & much more.</h2></center>

</td></tr>

<? include("footer.phtml"); ?>

Для удобства размещения элементов оформления используется таблица, которая открывается в верхнем шаблоне, закрывается в нижнем шаблоне, а ее основная часть будет разной в разных режимах работы.

2.6 Разработка витрины электронного магазина PHP и MySQL

Для МySQL в PHP разработаны функции прямого доступа к данным. Рассмотрим функции, без которых нам не обойтись.

1. Подключение к серверу

2. Выбор базы данных

3. Выполнение запроса

4. Получение очередной строки из результата запроса

5. Закрытие соединения.

Приступим к разработке витрины нашего электронного магазина.

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

Рис8. Каталог

Подключение к базе данных выглядит следующим образом:

mysql_connect("localhost", "root", "") or

die ("Не могу подключиться к серверу!");

mysql_select_db("books") or

die ("Не могу подключиться к базе данных!");

Выполнение двух запросов выглядит так:

$strSQL1="SELECT * FROM style ORDER BY name_st";

$result1=mysql_query($strSQL1) or

die("Не могу выполнить запрос!");

$strSQL2="SELECT * FROM categories ORDER BY name_cat";

$result2=mysql_query($strSQL2) or

die("Не могу выполнить запрос!");

Осталось вывести результаты запросов в две ячейки таблицы.

<table border=0 width=100%>

<tr><td width="50%"><center><h3>Style</h3></center><ul>

<?

while($row=mysql_fetch_array($result1))

{?>

<li><a href="show.phtml?type=1&id_publ=

<?print $row["id_st"];?>"><?print row["name_st"];?></a>

<?}?>

</ul></td>

<td width="50%"><center><h3>Events</h3></center><ul>

<?

while($row=mysql_fetch_array($result2))

{?>

<li><a href="show.phtml?type=2&id_cat=

<?print $row["id_cat"];?>"><?print $row["name_cat"];?></a>

<?}?>

</ul></td>

</tr>

</table>

Поскольку при щелчке по гиперссылке мы хотим получить список открыток по заданному стилю или событию, то в сценарий show.phtml следует передать параметры type (если он равен 1, то выбран стиль, если 2 - то событие) и id_st или id_cat.

2.7 Передача данных от браузера серверу

Мы сформировали гиперссылки с параметрами, чтобы передать серверу информацию, какой стиль или какое событие нас интересуют. Возникает вопрос: как сервер принимает эти параметры? Ответ на этот вопрос неоднозначен. Всё зависит от того, включен ли на сервере режим регистрации глобальных переменных. Если в файле php.ini установлен режим автоматической регистрации глобальных переменных

register_globals = on

то при вызове PHP-сценария по гиперссылке для каждого параметра создается серверная переменная с тем же именем, что у параметра. То есть, если мы создали гиперссылку

<a href="show.phtml?type=1&id_st=2">simple</a>

то в сценарии show.phtml будут существовать переменная с именем $type и значением 1, а также переменная с именем $id_st и значением 2. Тот же принцип применяется и для элементов формы (текстовых полей, списков, наборов радиокнопок, флажков), а также ключиков и сеансовых переменных. Для всех них также в этом случае автоматически создаются серверные переменные. Но автоматическая регистрация серверных переменных считается небезопасной!

Поэтому рекомендуется устанавливать параметр

register_globals = off

При этом для обращения к переменным придется использовать разнообразные ассоциативные массивы, которые автоматически создаются на сервере:

Именно такой подход мы и будем использовать в целях безопасности.

2.8 Просмотр списка открыток

Сценарий show.phtml предназначен для просмотра списка открыток.

Прежде всего, прочитаем параметры, переданные из браузера:

$id_st=$HTTP_GET_VARS["id_st"];

$id_cat=$HTTP_GET_VARS["id_cat"];

$type=$HTTP_GET_VARS["type"];

Если мы хотим выбрать открытки определенного стиля, мы передаем параметр type=1, и обращение к базе данных выглядит следующим образом:

Рис9. Выбор стиля

if ($type==1)

{

$strSQL1="SELECT name_st FROM style

WHERE id_st=".$id_st;

$result=mysql_query($strSQL1) or

die("Не могу выполнить запрос1!");

if($row=mysql_fetch_array($result))

$title=$row["name_publ"];

$strSQL1="SELECT id_card, image, size, name_card,

cards.id_st, name_st, price, cards.id_cat, name_cat

FROM cards, style, categories WHERE

cards.id_cat=categories.id_cat AND

cards.id_st=style.id_st AND cards.id_st=".$id_st;

}

Если же мы хотим выбрать открытки определенной категории, мы передаем параметр type=2, и обращение к базе данных выглядит следующим образом:

if ($type==2)

{

$strSQL1="SELECT name_cat FROM categories

WHERE id_cat=".$id_cat;

$result=mysql_query($strSQL1) or

die("Не могу выполнить запрос1!");

if($row=mysql_fetch_array($result))

$title=$row["name_cat"];

$strSQL1="SELECT id_card, image, size, name_card,

cards.id_st, name_st , price, cards.id_cat, name_cat

FROM cards, style, categories WHERE

cards.id_cat=categories.id_cat AND

cards.id_publ=style.id_st AND cards.id_cat=".$id_cat;

}

$result1=mysql_query($strSQL1) or

die("Не могу выполнить запрос2!");

Затем формируем HTML-таблицу с информацией об открытках. Под открыткой расположена гиперссылка "положить в корзину". Эта гиперссылка вызывает сценарий dobasket.phtml, в котором объединены несколько режимов работы с корзиной. Для добавления книги в корзину мы передаем параметры type=1 и id_card.

<a href="dobasket.phtml?type=1&id_ card =

<?print $row["id_ card "];?>">

<font size=-1>add to basket</font>

</a>

<table border="1" width="100%" align="right" >

<?

while($row=mysql_fetch_array($result1))

{?>

<tr>

<td align="center"><img src="images/<?print $row["image"];?>"

alt="<?print $row["name_ card "];?>" border="0">

<center><a href="dobasket.phtml?type=1&id_ card =

<?print $row["id_ card "];?>"><font size=-1>

положить в корзину</font></a></center></td>

<td>

<table>

<tr><td align="right"><i>size: </i></td>

<td><?print $row["size"];?></td></tr>

<tr><td align="right"><i>name: </i></td>

<td><?print $row["name_ card "];?></td></tr>

<tr><td align="right"><i>style: </i></td>

<td><a href="show.phtml?type=1&id_st=

<?print $row["id_st"];?>">

<?print $row["name_st"];?></a></td></tr>

<tr><td align="right"><i>price: </i></td>

<td><?print $row["price"];?></td></tr>

<tr><td align="right"><i>event: </i></td>

<td><a href="show.phtml?type=2&id_cat=

<?print $row["id_cat"];?>">

<?print $row["name_cat"];?></a></td></tr>

</table>

</td></tr>

<?}?>

</table>

2.9 Разработка корзины покупателя

При просмотре каталога покупатели непременно захотят отложить понравившиеся открытки в корзину. При этом предварительной регистрации мы не требуем. Как же отличить корзину одного покупателя от корзины другого? В таких случаях обычно используется стандартный подход анонимных корзин, предусматривающий хранение идентификатора корзины в ключике (cookie) на компьютере пользователя.

Cookies, или, как их называют по-русски, ключики, представляют собой именованные кусочки информации, которые web-сервер может сохранить на клиентском компьютере. Рассмотрим коротко процесс передачи ключиков между сервером и клиентом. Он состоит из следующих шагов:

1. Сервер передает информацию о ключике, который он хочет создать: имя, значение, срок действия, имя домена (ключик всегда создается для конкретного домена) в служебной части HTML-страницы, в виде строки заголовка (header).

2. Браузер клиента записывает ключик в специальный файл на компьютере клиента. Ключик будет храниться там, пока не истечет срок его действия (для хранимых ключиков), либо пока браузер не будет закрыт (для временных ключиков).

3. При формировании запроса к web-серверу о получении какой-либо страницы браузер отправляет в заголовке запроса все ключики этого домена, которые хранятся на клиентском компьютере.

4. Сервер вместе с запросом страницы получает информацию о ключиках и может ее использовать по собственному усмотрению.

Ключики являются единственным средством сохранения информации из web-страницы на компьютере клиента. Необходимость в сохранении информации возникает, например, в том случае, если нужно отслеживать сеанс пользователя и однозначно его идентифицировать. Проблема здесь состоит в том, что отдельные HTML-страницы сайта очень слабо связаны друг с другом и для передачи информации между ними существует не так уж много способов. Вернемся к электронному магазину. Пользователь, перемещаясь по страницам магазина, выбирает товары и кладет их в корзину. Для сохранения этой информации можно использовать следующие подходы:

* Использовать фреймовую структуру и хранить информацию в глобальных переменных на уровне frameset с помощью клиентских сценариев JavaScript или VBScript. Эти переменные будут доступны из любого фрейма, но, разумеется, будут уничтожены при закрытии окна браузера и даже просто при переходе на другой сайт (по поводу фреймов и языка клиентских сценариев JavaScript

* Хранить информацию о корзине на сервере в базе данных. Этот способ позволяет сохранять информацию в течение любого срока. Для однозначной идентификации корзины пользователя нужно только присвоить ей уникальный номер. Этот номер можно передавать между HTML-страницами в виде скрытого поля, а можно записать его в cookies. Именно этот подход мы и будем здесь использовать.

Создание ключика для идентификатора корзины

Итак, казалось бы, ключик для корзины разумно создавать при входе на главную страницу. Но пользователь может зайти на любую страницу нашего сайта, просто набрав ее адрес в адресной строке! Поэтому любая страница нашего сайта должна содержать следующие действия: следует либо создавать ключик, если он не существует, либо продлевать срок хранения ключика на заданный интервал, начиная с текущего момента. Установим, что срок хранения корзины равен двум неделям. Соответствующий сценарий удобно поместить в верхний шаблон header.phtml, тогда он наверняка будет выполняться при загрузке любой страницы сайта.

$id_bask=$HTTP_COOKIE_VARS["id_bask"];

if (!isset($id_bask))

{

$uniq_ID=uniqid("ID");

setcookie("id_bask", $uniq_ID, time()+60*60*24*14);

// создадим ключик

}

else

setcookie("id_bask", $id_bask, time()+60*60*24*14);

// пересоздадим ключик с тем же значением, т. е.

// продлим его срок хранения еще на 2 недели

Рассмотрим более подробно этот сценарий. Прежде всего, мы пытаемся прочитать ключик из глобального серверного массива и проверяем, не является ли он пустым. Для этого используется функция isset:

if (!isset($id_bask))

{ ... }

проверяет, существует ли переменная с int isset (mixed имя_ключика) заданным именем. Если не существует, возвращает 0.

Если ключик не существует, нужно сгенерировать для него значение, а затем сохранить его на компьютере клиента. Для генерации значения удобно использовать функцию uniqid.

$uniq_ID=uniqid("ID");

а затем собственно создать ключик:

setcookie("id_bask", $uniq_ID, time()+60*60*24*14);

Рассмотрим более подробно параметры этой функции.

* Имя является обязательным параметром и подчиняется общим правилам имен для идентификаторов.

* Значение может быть любым.

* Срок действия измеряется в секундах; если срок не задан, то ключик является временным и уничтожается по завершении сеанса работы браузера.

* Домен, который создал данный ключик, может читать его значение.

Для остальных доменов это запрещено. По умолчанию используется имя домена, от которого было получено значение этого ключика.

* Безопасность имеет значение истина/ложь и указывает, можно ли читать ключик в небезопасной среде.

Для искусственного удаления ключика в качестве срока действия нужно указать уже прошедший момент времени (значение ключика можно задавать любое):

setcookie("id_bask", "", time()-600);

2.10 Просмотр корзины

Рис10. Корзина покупателя

В сценарии просмотра корзины basket.phtml прежде всего читаем значение ключика из глобального массива:

$id_bask=$HTTP_COOKIE_VARS["id_bask"];

Затем проверяем, не является ли корзина пустой:

<?

$strSQL1="SELECT COUNT(*) as count FROM basket_books WHERE

id_bask='".$id_bask."'";

$result1=mysql_query($strSQL1) or die("Не могу выполнить

запрос1!");

$row=mysql_fetch_array($result1);

if($row["count"]==0)

{

?>

<tr><td bgcolor='#ff9999' align='center'>

<b>Ваша корзина пуста!</b></td></tr>

<?

}?>

Если корзина не пуста, выдаем ее содержимое на экран. Обратите внимание, как подсчитывается итоговая сумма. Обратите также внимание, как создаются гиперссылки «+» и «-».

<?

else

{

$strSQL1="SELECT image, author, name_book, pages, price, kolvo,

id_bask, books.id_book FROM books, basket_books

WHERE books.id_book=basket_books.id_book

AND id_bask='".$id_bask."'";

$result1=mysql_query($strSQL1) or die("Не могу выполнить

запрос2!");

?>

<tr><td>

<table border="1" width="100%" align="right" >

<tr><td align="right"><i>Автор: </i></td>

<td align="right"><i>Название: </i></td>

<td align="right"><i>Цена: </i></td>

<td align="right"><i>Количество: </i></td>

<td></td></tr>

<?

$sum=0;

while($row=mysql_fetch_array($result1))

{

?>

<tr>

<td><?print $row["author"];?></td>

<td><b><?print $row["name_book"];?></b></td>

<td><?print $row["price"];?></td>

<td><?print $row["kolvo"];?>

<a href="dobasket.phtml?type=1&id_book=

<?print $row["id_book"];?>" title="Увеличить">[ + ]</a>

<a href="dobasket.phtml?type=2&id_card=

<?print $row["id_card"];?>" title="Уменьшить">[ - ]</a>

</td>

<td> <a href="dobasket.phtml?type=3&id_card=

<?print $row["id_card"];?>">Удалить</a></td>

</tr>

<?

$sum=$sum+$row["price"]*$row["kolvo"];

}?>

<tr><td align="right"></td><td align="right"><i>ИТОГО:

</i></td><td align="right"><?print $sum;?></td><td align="right"></td></tr>

</table>

<?

}?>

2.11 Добавление товара в корзину

Когда в каталоге книг пользователь выбирает понравившуюся книгу и щелкает по ссылке "положить в корзину", вызывается сценарий dobasket.phtml, в который передаются параметры type=1 и id_card (код выбранной открытки). Кроме того, в этом сценарии нам потребуется ключик $id_bask, который означает идентификатор корзины. Читаем эти данные из глобальных массивов: $type=$HTTP_GET_VARS["type"];

$id_card=$HTTP_GET_VARS["id_card"];

$id_bask=$HTTP_COOKIE_VARS["id_card"];

Алгоритм при добавлении товара в корзину выглядит следующим образом. Если эта книга уже присутствует в корзине, то мы только увеличиваем количество на единицу. В противном случае в корзину добавляем новую строку (примечание: функция MySQL CURDATE()возвращает текущую дату).

При динамическом формировании запросов значения строковых констант (которые используются, например, в опции WHERE) следует помещать в одинарные кавычки.

if($type==1) // положить в корзину

{

$strSQL="SELECT * FROM basket_cards

WHERE id_card=".$id_ card." AND id_bask='".$id_bask."'";

$result=mysql_query($strSQL) or

die("Не могу выполнить запрос1!");

if ($row=mysql_fetch_array($result))

{

$strSQL="UPDATE basket_ cards SET kolvo=kolvo+1

WHERE id_ card =".$id_ card." AND id_bask='".$id_bask."'";

}

else

{

$strSQL="INSERT INTO basket_ cards (id_bask, id_ card,

Kolvo, date_bask) VALUES

('".$id_bask."',".$id_ card.",1,CURDATE())";

}

mysql_query($strSQL);

}

После выполнения действий с базой данных мы хотим выдать пользователю на экран состав его корзины. Соответствующий сценарий просмотра корзины у нас уже есть. Поэтому последняя команда в сценарии dobasket.phtml заключается в подключении страницы basket.phtml:

<? include("basket.phtml"); ?>

2.12 Уменьшение и увеличение количества

Как видим при просмотре корзины, рядом с каждым товаром есть две гиперссылки - со значками "плюс" и "минус". Эти гиперссылки означают "увеличить количество товара в корзине на одну штуку" и "уменьшить количество товара в корзине на одну штуку". При щелчке по гиперссылке "+" вызывается сценарий dobasket.phtml с параметром type=1, соответствующий код сценария мы уже рассмотрели при добавлении товара в корзину. При щелчке по гиперссылке "-" вызывается сценарий dobasket.phtml с параметром type=2. Если количество было равно 1, то мы полностью удаляем данную книгу из корзины. Если же количество было больше 1, то мы просто переписываем строку в корзине, уменьшая количество на единицу.

if($type==2) // уменьшить количество

{

$strSQL="SELECT * FROM basket_ cards WHERE

id_ card =".$id_ card." AND id_bask='".$id_bask."'";

$result=mysql_query($strSQL)

or die("Не могу выполнить запрос1!");

if ($row=mysql_fetch_array($result))

{

if ($row["kolvo"]>1)

{

$strSQL="UPDATE basket_ cards SET kolvo=kolvo-1 WHERE

id_ card =".$id_ card." AND id_bask='".$id_bask."'";

}

else

{

$strSQL="DELETE FROM basket_ cards WHERE

id_ card =".$id_ card." AND id_bask='".$id_bask."'";

}

}

mysql_query($strSQL);

}

2.13 Удаление товара из корзины

При просмотре корзины также можно удалить любой товар из нее. Для этого служит гиперссылка "Удалить", по которой вызывается тот же сценарий dobasket.phtml, но уже с параметром type=3:

if($type==3) // удалить из корзины

{

$strSQL="DELETE FROM basket_ cards WHERE

id_ card =".$id_ card." AND id_bask='".$id_bask."'";

mysql_query($strSQL);

}

Кроме того, корзину можно полностью очистить, щелкнув по гиперссылке "Очистить корзину". В этом случае опять вызывается тот же сценарий dobasket.phtml, но с параметром type=4:

if($type==4) // очистить корзину

{

$strSQL="DELETE FROM basket_ cards WHERE

id_bask='".$id_bask."'";

mysql_query($strSQL);

}

2.14 Разработка системы регистрации и авторизации

рис11. Регистрация

Для регистрации будем использовать следующую форму (reg.phtml).

После того как посетитель нашего магазина отложил понравившиеся ему открытки в корзину, возможно, он захочет их действительно купить. Для этого пользователь должен сообщить информацию о себе, т.е. зарегистрироваться. Обратите внимание, что кроме текстовых полей в форме есть флажок:

<input type="checkbox" value="1" name="subscribe">

<i>Подписаться на рассылку новостей</i>

При щелчке на кнопке "отправить" будет вызываться тот же сценарий reg.phtml, в который передаются все значения полей этой формы, включая скрытое поле с именем type и значением 1 (это скрытое поле нужно для того, чтобы при первой загрузке формы регистрации не выполнялось никаких проверок). В сценарии проверяется корректность заполнения полей формы:

$fam=$HTTP_POST_VARS["fam"];

$im=$HTTP_POST_VARS["im"];

$addr=$HTTP_POST_VARS["addr"];

$mail=$HTTP_POST_VARS["mail"];

$pass=$HTTP_POST_VARS["pass"];

$pass2=$HTTP_POST_VARS["pass2"];

$login=$HTTP_POST_VARS["login"];

$type=$HTTP_POST_VARS["type"];

$subscribe=$HTTP_POST_VARS["subscribe"];

// была нажата кнопка "отправить" ?

if($type==1)

{

// все поля не пустые ?

if($fam!="" && $im!="" && $addr!="" && $mail!="" && $login!=""

&& $pass!="" && $pass2!="")

{

// поля пароля и повтора пароля не совпадают ?

if($pass!=$pass2)

{

$message="<tr><td bgcolor='#ff9999' align='center'><b>

Поля пароля и повтора пароля не совпадают!!!</b></td></tr>";

}

else

{

// ищем, нет ли в базе данных пользователя с таким логином

$strSQL1="SELECT id_cust FROM customers WHERE

login='".$login."'";

$result1=mysql_query($strSQL1)

or die("Не могу выполнить запрос!");

// такой логин уже есть ?

if($row=mysql_fetch_array($result1))

{

$message="<tr><td bgcolor='#ff9999' align='center'>

<b>Такой логин уже существует!!! Выберите другой

логин</b></td></tr>";

}

else

{

// создаем нового пользователя

$strSQL1="INSERT INTO customers

(fam, im, addr, mail, login, pass, subscribe)

VALUES('".$fam."','".$im."','".$addr."','".

$mail."','".$login."','".$pass."','".$subscribe."')";

$result1=mysql_query($strSQL1)

or die("Не могу выполнить запрос!");

$message="<tr><td bgcolor='#66cc66' align='center'>

<b>Вы успешно зарегистрированы</b></td></tr>";

$success=true

}

}

}

else

$message="<tr><td bgcolor='#ff9999' align='center'><b>Не все

поля заполнены!!!</b></td></tr>";

}

В том случае, если пользователь заполнил форму с какими-либо ошибками, она снова выводится на экран для корректировки этих ошибок.

<form action=reg.phtml method=post>

<tr><td>

<table border="0" width="100%" align="right" >

<tr><td align="right"><i>Фамилия: </i></td><td>

<input type=text name=fam value="<?print $fam?>"></td></tr>

<tr><td align="right"><i>Имя: </i></td><td>

<input type=text name=im value="<?print $im?>"></td></tr>

<tr><td align="right"><i>Адрес: </i></td><td>

<input type=text name=addr value="<?print $addr?>"></td></tr>

<tr><td align="right"><i>E-mail: </i></td><td>

<input type=text name=mail value="<?print $mail?>"></td></tr>

<tr><td align="right"><i>Логин: </i></td><td>

<input type=text name=login value="<?print $login?>"></td></tr>

<tr><td align="right"><i>Пароль: </i></td><td>

<input type=password name=pass value=""></td></tr>

<tr><td align="right"><i>Повтор пароля: </i></td><td>

<input type=password name=pass2 value=""></td></tr>

<tr><td></td>

<td><input type="checkbox" value="1" name="subscribe">

<i>Подписаться на рассылку новостей</i></td></tr>

<input type=hidden value=1 name=type>

<tr><td align="right"></td><td>

<input type=submit value="отправить"></td></tr>

</table>

</form>

Наконец, после правильного заполнения всех обязательных полей формы пользователь будет зарегистрирован.

Рис12. Успешная регистрация

2.15 Сессии

В качестве более безопасной альтернативы временным ключикам можно использовать такое понятие, как сессии. Сессия, или сеанс данных позволяет хранить практически неограниченное количество информации в сеансовых переменных. Технологически сессии тоже опираются на ключики; точнее говоря, один ключик - номер сессии - обычно хранится на клиенте, а вся остальная сеансовая информация - на сервере. Для работы необходимы, по крайней мере, следующие функции:

Также необходимо перед началом работы в файле php.ini установить параметр для автостарта сессии:

session.auto_start = 1

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

2.16 Авторизация

Для посетителей, зарегистрированных в нашем магазине, в дальнейшем не требуется заново вводить информацию о себе - достаточно просто набрать логин и пароль, т.е., авторизоваться. Для авторизации предназначена форма рядом с логотипом магазина. При нажатии на кнопку "ok" вызывается сценарий auto.pthml, в котором проверяется корректность введенных логина и пароля.

$pass=$HTTP_POST_VARS["pass"];

$login=$HTTP_POST_VARS["login"];

$strSQL1="SELECT * FROM customers WHERE login='".$login.

"' AND pass='".$pass."'";

print $strsql;

$result1=mysql_query($strSQL1)

or die("Не могу выполнить запрос!");

// пользователь с таким логином и паролем найден ?

if($row=mysql_fetch_array($result1))

{

$start=session_start(); // начинаем сессию

// создадим сеансовую переменную для ФИО покупателя

session_register("log");

$HTTP_SESSION_VARS["log"]=$row["fam"]." ".$row["im"];

// создадим сеансовую переменную для ID покупателя

session_register("id");

$HTTP_SESSION_VARS["id"]=$row["id_cust"];

$message="<tr><td bgcolor='#66cc66' align='center'>

<b>Вы успешно авторизованы</b></td></tr>";

$success=true;

}

else

{

$message="<tr><td bgcolor='#ff9999' align='center'>

<b>Таких логина/ пароля не существует!!!</b></td></tr>";

}

if($success)

{

include ("cabinet.phtml");

}

else

{

include("header.phtml");

print $message;

include("footer.phtml");

}

Если данные введены неверно, пользователь получит сообщение об ошибке:

Рис12. Ошибка регистрации

В случае успешной авторизации создаются сеансовые переменные с именами id (идентификатор) и log (фамилия, имя). Содержимое переменной log будет в дальнейшем выводиться под формой авторизации, а значение переменной id будет нужно для оформления заказа. В случае успешной авторизации перенаправляем пользователя в его «личный кабинет», где он получает возможность откорректировать информацию о себе и просмотреть свои заказы. Обратите внимание также, что в свой личный кабинет авторизованный пользователь сможет попасть в любой момент - для этого мы создадим специальную гиперссылку под формой авторизации (в файле header.phtml):

if(isset($HTTP_SESSION_VARS["log"]))


Подобные документы

  • Преимущества и недостатки электронной коммерции. Описание локального сервера Denwer. Структура файлов и папок. Особенности PHP, MySQL, CSS, HTML. Разработка структуры сайта интернет-магазина по продажи гитар и комплектующих, его программная реализация.

    курсовая работа [5,0 M], добавлен 25.10.2014

  • Создание информационной системы, предназначенной для оформления заказов на изготовление моделей и учет продажи готовых деталей. Составление запросов, реализуемых средствами системы управления базами банных MySQL. Разработка таблиц и схемы базы данных.

    контрольная работа [1,4 M], добавлен 05.01.2013

  • Системы управления базами данных: сущность и характеристика. Типы данных и свойства полей СУБД Access. Объекты базы данных: таблицы, схемы данных, формы, запросы, отчеты. Разработка и проектирование базы данных "Продажи книг" в среде Microsoft Access.

    курсовая работа [1,8 M], добавлен 04.02.2013

  • Средства, используемые при разработке интернет-приложения. Язык обработки сценариев на стороне web-сервера. Система управления базами данных MySQL. Проектирование front-offiсe. Проектирование ER модели данных с использованием модели "сущность-связь".

    курсовая работа [3,5 M], добавлен 15.01.2014

  • Установка и настройка локального web–сервера и его компонентов. Конфигурационные файлы сервера Apache и их натройка. Настройка PHP, MySQL и Sendmail. Проверка работоспособности виртуальных серверов. Создание виртуальных хостов. Тест Server Side Includes.

    учебное пособие [6,2 M], добавлен 27.04.2009

Работа, которую точно примут
Сколько стоит?

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.