ЧАСТЬ 1. Проектирование решений в области электронной коммерции

ЧАСТЬ 1. Проектирование решений в области электронной коммерции

Прежде чем переходить к серьезному программированию, необходимо понять, какие же задачи мы собираемся решать с помощью этой технологии. На рынке и в средствах массовой информации термин "электронная коммерция" имеет много разных значений. В главе 1 мы разберемся с тем, что же такое электронная коммерция и каким конкретным темам в этой книге будет уделено основное внимание. Глава 2 посвящена описанию инструментов Microsoft, используемых в книге. В главах 3 и 4 рассматривается процесс проектирования и построения решений из области электронной коммерции, при этом особое внимание уделяется базам данных и системным требованиям. В главе 5 мы построим первое небольшое приложение.

Глава 1. Электронная коммерция: общие сведения

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

Большинство людей полагают, что электронная коммерция - это покупка товаров в режиме онлайн. Обычно это называется электронной коммерцией типа К/Б (клиент/бизнес) - традиционная розничная торговля "магазинного" типа. К числу современных представителей такого рода электронной коммерции в Web относятся сайты Martha Stewart (http://www.marthastewart.com), Amazon (http://www.amazon.com) и многие другие. У таких компаний, как Dell computers (http://www.dell.com), объемы продаж через Web начали приближаться к объемам продаж по традиционным розничным каналам. Такие сайты уже сейчас занимают важную область рынка и, несомненно, будут продолжать расти.

Электронная коммерция также включает рыночное пространство Б/Б (бизнес/бизнес), претендующее на значительную часть деловых операций в Интернете. Только представьте себе всю цепочку операций, связанных с производством и поддержкой многих ежедневно используемых нами товаров и услуг! Примером электронной коммерции типа Б/Б является взаимодействие оптовых компаний с розничными торговцами - например, когда крупный производитель PC продает свои товары дистрибьюторам и крупным розничным торговцам. По мере развития коммерции Б/Б бизнес будет все чаще опираться на этот тип электронной коммерции как на повседневное деловое решение. Вероятно, ваш любимый ресторан за углом будет использовать эту технологию для закупки продуктов у разных поставщиков; то же самое будут делать бакалейные лавки, книжные магазины и другие традиционные предприятия. Наступит день, когда Интернет превратится в стандартную среду для проведения деловых сделок, и этот день уже не за горами.

Фазы процесса электронной коммерции

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

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

Давайте рассмотрим все фазы и их роль в процессе электронной коммерции.

Маркетинг

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

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

В этой книге мы не будем рассматривать технологию применения Интернета для проведения маркетинга и построения сообществ. Наше внимание будет сосредоточено на применении этой технологии для обслуживания клиентов, посетивших ваш Web-сайт (см. главу "Рекламные кампании" части 4).

Клиент/посетитель

Конечно, чего стоит электронная коммерция без клиента! В нашем случае клиентом является пользователь Сети, который решил ввести ваш URL или щелкнуть на ссылке для посещения вашего Web-узла. В данном случае необходимо различать две категории клиентов, "бизнес/бизнес" и "клиент/бизнес". Типичным покупателем из первой категории является другая компания, которой необходимо предоставить различные возможности оформления покупки, такие как оплата по кредитной карте, в кредит и/или оформление заказа на приобретение. Возможно, продавец должен будет предоставить покупателю номер заказа. При оформлении заказов на большую сумму и критически важных покупках могут возникнуть дополнительные требования - например, аутентификация полученного заказа, электронный перевод средств и т. д. Многие проблемы традиционно решаются посредством механизма EDI (Electronic Data Interchange), обеспечивающего согласованные стандарты обмена данными в деловых операциях.

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

Посещение Web-сайта

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

Просмотр товаров

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

Отбор товаров

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

Оформление заказа

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

Налоги и стоимость доставки

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

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

Оплата

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

При использовании кредитных карт проверка/оплата может осуществляться как в автономном, так и в подключенном режиме. Онлайновая обработка кредитных карт через Интернет может производиться через такие службы, как Cyber-Cash и HP-Veriphone. При онлайновой обработке происходит защищенная пересылка данных кредитной карты по Сети и возвращается ответ, показывающий, прошла кредитная карта проверку или нет.

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

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

Обработка заказа

На этой стадии клиент выходит из игры, а цикл электронной коммерции подходит к концу. Если данные кредитной карты не были обработаны автоматически, обработка заказа начинается с финансовой транзакции. Как правило, на этой стадии действуют стандартные правила ведения бизнеса, словно заказ поступил по телефону или почте. Интернет позволяет информировать клиента о статусе обработки заказа. Например, можно сообщить о том, что заказ был полностью обработан, что все товары имеются в наличии и т. д. Соответствующие методы реализуются на Web-узле. Данная возможность рассматривается в главе 8 "Оформление заказа".

ПРИМЕЧАНИЕ.
При продаже через Интернет цифровой информации доставка товара может происходить сразу же после проверки кредитной карты. В этом случае покупателю передается необходимая ссылка и предоставляется доступ к файлам. Все происходит за один этап.

Исполнение заказа

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

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

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

Доставка

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

Управление магазином

Работа коммерческого Web-сайта не ограничивается взаимодействием с пользователем. Также приходится учитывать всевозможные аспекты управления магазином. Правильный выбор средств для управления коммерческим Web-сайтом столь же важен, как и выбор средств для построения интерфейса пользователя. Средства управления магазином могут решать разнообразные задачи, от простого составления отчетов и отслеживания заказов до полноценных операций с базами данных. В табл. 1.1 приведены некоторые функциональных возможностей, поддерживаемых приличным интерфейсом управления. Все управляющие средства могут строиться на основе тех же технологий, что и интерфейс покупателя. Все примеры магазинов, входящие в поставку Site Server 3, Commerce Edition, содержат управляющие интерфейсы.

Таблица 1.1. Функциональные возможности интерфейса управления
Функция
Описание
Безопасность Высокий уровень безопасности гарантирует, что доступ к управляющим функциям предоставляется только проверенным пользователям, обладающим необходимыми полномочиями. Кроме того, вы должны позаботиться о том, чтобы данные кредитной карты и информация о заказе не были перехвачены на пути к поставщику
Управление товарами При желании операции с товарами магазина могут выполняться прямо с Web-сервера. В этом случае записи товаров создаются, обновляются и удаляются прямо на Web-страницах. Возможно, при этом вам придется организовать автоматизированное согласование электронного магазина с традиционной системой управления товарами
Отслеживание заказов и составление отчетов Существует много вариантов организации отслеживания заказов и составления отчетов. Отчеты могут генерироваться в формате базы данных (например, Microsoft Access) или в виде ASCII-файлов с разделением полей запятыми - например, с целью интеграции с отдельными средствами анализа данных. Возможно, вы захотите строить отчеты для анализа истории заказов и т. д.
Управление разделами/ категориями Наряду с управлением товарами можно реализовать средства управления классификацией товаров по разделам
Управление рекламными средствами Одним из важнейших аспектов управления сайтов может оказаться администрирование рекламных кампаний, распродаж, горизонтальных и вертикальных связей и прочих рекламных акций, предложенных вашими специалистами по маркетингу
Управление данными покупателей Если ваш коммерческий сайт хранит профильные данные и автоматически опознает покупателей, вам понадобятся средства для работы с профилями
Управление бизнес-логикой Практический каждый аспект работы магазина должен настраиваться при помощи специальных управляющих средств. Вычислением налогов, стоимости доставки и другими критическими бизнес-правилами работы сайта можно легко управлять из Web-интерфейса

Однако технология, на базе которой строится интерфейс управления, не обязательно строится на основе технологии Web-страниц. Традиционные средства разработки "клиент/сервер" также могут предоставить средства, необходимые для управления электронным магазином. Единственный потенциальный недостаток такого решения заключается в том, что удаленное расположение серверного комплекса затрудняет реализацию управления магазином на Visual Basic. Конечно, для подключения к базам данных можно использовать такие технологии, как RDS (Remote Data Services), но такое решение по своей гибкости уступает интерфейсу на базе Web-броузера.

Итоги

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

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

Успешное ведение электронного бизнеса требует основательного планирования. В этой книге будет показано, как использовать уже знакомые вам программные средства - Visual Basic, SQL Server, Windows NT и т. д. - для построения успешного, многофункционального электронного представительства вашей отрасли бизнеса.

Глава 2. Инструментарий Microsoft

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

Инструментарий Microsoft

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

Microsoft Windows NT Server 4

Операционная система Windows NT служит основой для создания решений, программируемых на Visual Basic. Она обеспечивает безопасность, функциональные средства TCP/IP и другие базовые возможности, необходимые для операционной системы Web-сервера. В табл. 2.1 перечислены ключевые возможности системы, относящиеся к области электронной коммерции.

Таблица 2.1. Основные возможности NT, относящиеся к области Web и электронной коммерции
Аспект
Описание
Безопасность Операционная система любого Web-сервера должна обладать средствами безопасности, необходимыми для защиты сети и операционной системы от внешнего мира
Сетевые средства TCP/IP При помощи стандартного для Интернета сетевого протокола TCP/IP компьютеры взаимодействуют друг с другом
Поддержка модели составного объекта (СОМ) СОМ играет важнейшую роль при использовании Visual Basic для построения объектов, необходимых для работы коммерческого Web-узла
Web-сервер Сервер IIS (Internet Information Server) обеспечивает основную функциональность Web-сервера (см, следующий раздел)

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

ПРИМЕЧАНИЕ
На момент издания книги работа над Windows 2000 подходила к концу. По имеющейся информации, в Windows 2000 базовые функциональные средства Web-сервера были заметно усовершенствованы. Платформа Active Directory Services обладает еще большими возможностями по управлению файлами и безопасностью на уровне каталогов. Программы, описанные в книге, не используют специфических возможностей конкретной системы, они нормально работают в среде NT 4 и Windows 2000.

Internet Information Server (IIS)/ Windows NT 4 Option Pack

Web-сервер IIS распространяется в составе Windows NT 4. Его последняя версия, IIS 4.0, входит в Windows NT Option Pack. Новая версия IIS будет распространяться в составе Windows 2000. Основные возможности IIS перечислены в табл. 2.2.

Таблица 2.2. Компоненты Web-сервера IIS
Возможность
Описание
Index Server Index Server обеспечивает индексацию содержимого сайта, включая HTML-страницы, документы Word и т. д. Это позволяет реализовать на Web-узле средства поиска на узле
Служба FTP IIS обеспечивает базовую поддержку протокола FTP (File Transfer Protocol)
Служба HTTP IIS обеспечивает базовую поддержку протокола HTTP (Hyper Text Transfer Protocol)
Служба SMTP IIS также поддерживает почтовый протокол SMTP (Simple Mail Transfer Protocol) для отправки электронной почты Web-сервером
Служба NNTP IIS обеспечивает настройку и поддержку системы электронных новостей
Certificate Server Дает возможность создания собственных сертификатов, используемых в ходе аутентификации между сервером и клиентом
Message Queue Server Microsoft Message Queue Server (MSMQ) представляет собой быструю службу хранения и передачи (store and forward) для Microsoft Windows NT Server
Transaction Server В Option Pack также входит Microsoft Transaction Server, предназначенный для разработки быстродействующих, критически важных приложений
ММС Консоль управления (management console) представляет собой интерфейс для управления Web-сервером
Active Server Pages Технология Active Server Pages является основой для создания Web-приложений. Механизм ASP позволяет работать с несколькими сценарными языками и обладает интегрированной поддержкой VBScript и JavaScript (JScript)
Расширения FrontPage Ключевой инструмент, используемый при создании сайтов в Microsoft FrontPage и Microsoft Visual InterDev. Эти расширения позволяют InterDev и FrontPage 98 управлять Web-сайтом по стандартному протоколу TCP/IP

Active Server Pages (ASP)/Visual InterDev

Среди инструментов, которыми мы будем пользоваться для создания приложений, центральное место занимает один из компонентов IIS - Active Server Pages (ASP). ASP используется в сочетании с Visual InterDev - средством разработчика, предназначенным для создания Web-страниц, работы с SQL Server и построения коммерческих приложений. Основные возможности ASP перечислены в табл. 2.3.

Таблица 2.3. Основные возможности ASP
Возможность
Описание
Язык VBScript Технология Active Server Pages дает возможность объединять HTML-код на стороне клиента с серверным кодом VBScript - слегка усеченной версией популярного языка программирования Visual Basic. Серверный код VBScript работает с базами данных, управляет кодом HTML, передаваемым броузеру клиента, и решает множество других задач
Встроенные объекты В IIS существуют встроенные объекты, обеспечивающие базовую функциональность при программировании ASP - например, объекты Response и Request. Эти объекты используются для управления cookie, хранения информации о состоянии сеанса, использования других функций сервера и т. д.
Компоненты СОМ В ASP входит ряд других компонентов СОМ, в том числе ADO для работы с удаленными источниками данных, средства проверки возможностей пользовательского броузера, ротации рекламных баннеров и т. д.

Важнейшим инструментом, используемым в этой книге, является Visual InterDev. Именно в этой рабочей среде мы будем строить электронные магазины на базе ASP. Кроме того, мы будем использовать Visual InterDev для вставки в ASP объектов СОМ, созданных в Visual Basic 6.

В последней части этой книги, при описании Site Server Commerce Edition, Visual InterDev также будет использоваться для работы с ASP-кодом примеров магазинов. Основные возможности Visual InterDev перечислены в табл. 2.4.

Таблица 2.4. Возможности Visual InterDev
Возможность
Описание
Средства работы с базами данных SQL Visual InterDev обеспечивает превосходный интерфейс для работы с удаленными базами данных. Вы можете строить запросы, управлять таблицами, работать с хранимыми процедурами и выполнять все важнейшие функции, используемые при работе с данными в приложениях электронной коммерции
Удаленное управление сервером Используя серверные расширения FrontPage, в Visual InterDev можно осуществлять удаленное управление Web-проектами, находящимися на сервере
Разработка страниц Active Server Pages Этот инструмент, разумеется, в первую очередь предназначен для программирования ASP
Командная разработка проектов/ интеграция с Visual Source Safe Использование Visual Source Safe и серверных расширений FrontPage позволяет легко организовать работу с общим набором страниц в групповых проектах. Страницы, находящиеся в работе, блокируются и не могут использоваться другими программистами
Клиентский редактор HTML/сценариев Возможности Visual InterDev не ограничиваются программированием серверных сценариев. Вы также можете работать со сценариями, работающими на стороне клиента, кодом DHTML, каскадными списками стилей и т. д.
Средства отладки Средства отладки предусмотрены практически во всех средах программирования. Они упрощают поиск ошибок, допущенных при программировании

SQL Server

Конечно, программирование играет важную роль в электронной коммерции, однако базы данных еще важнее. Если бы не базы данных с информацией о товарах, корзинах, заказах и т. д., электронной коммерции не существовало бы вообще. Microsoft SQL Server обеспечивает мощную платформу для построения многоуровневых Web-приложений. Объем логики, реализуемой на уровне базы данных, зависит от специфики вашего приложения. При управлении многосерверными Web-комплексами правильное распределение функций на уровнях клиента, Web-сервера и базы данных является решающим фактором, обеспечивающим нормальное быстродействие и сбалансированную загрузку серверов.

Настройка SQL Server позволяет реализовать разные уровни безопасности, сегментирование с репликацией, программирование логики в хранимых процедурах и т. д. Используя технологии ActiveX Data Objects (ADO) n OLE DB (или ODBC), вы сможете работать с базой данных практически во всех интерфейсах и средах программирования от Microsoft.

Visual Basic 6

Хотя технология ASP сама по себе является мощной средой программирования серверных Web-приложений за счет поддерживаемых сценарных языков, существует возможность ее расширения за счет использования откомпилированного программного кода, написанного на языках типа Visual Basic. Существует несколько вариантов интеграции Visual Basic с Интернетом, все они перечислены в табл. 2.5.

Таблица 2.5. Интернет-программирование в Visual Basic
Возможность
Описание
Приложения IIS Начиная с версии 6, в Visual Basic появился новый класс приложений - приложения IIS. Это программы Visual Basic с интерфейсом стандартного броузера на базе HTML. В приложениях IIS программист может использовать все знакомые средства VB - классы, операции с базами данных и т. д. Единственное различие заключается в том, что вместо стандартной формы используется броузер. Приложения IIS работают на Web-сервере, к ним можно обращаться из интрасети или Интернета
Объекты СОМ Одним из важнейших аспектов программирования в области электронной коммерции является создание бизнес-объектов COM (Component Object Model). Например, для цикла электронной коммерции, описанного в главе 1, можно построить объекты, инкапсулирующие логику вычисления налогов и расходов на доставку. В дальнейшем эти объекты СОМ будут вызываться из сценариев ASP
Броузерный элемент WIN INET Конечно, в Web-приложениях можно использовать и традиционный интерфейс форм Visual Basic. В Visual Basic входит элемент ActiveX, который размещается на форме и частично воспроизводит функции Internet Explorer. Данная возможность часто используется при создании утилит управления электронным магазином
Элементы ActiveX Visual Basic позволяет создавать элементы ActiveX, используемые броузером Internet Explorer на компьютере клиента. Эта возможность также хорошо подходит для инкапсуляции операций по управлению магазином
Приложения DHTML Приложения DHTML, как и приложения IIS, впервые появились в Visual Basic версии 6. Приложения DHTML позволяют программистам Visual Basic создавать интерфейсы DHTML в Internet Explorer, используя вместо JScript или VBScript полноценный Visual Basic. Обратите внимание на принципиальное отличие: DHTML работает на стороне клиента, тогда как приложения IIS работают на стороне сервера

В этой книге мы подробно рассмотрим процесс создания бизнес-объектов в Visual Basic 6. Мы бы также могли заняться использованием приложений IIS для программирования электронных магазинов, а также применением DHTML в интерфейсе управления, однако разработка приложений электронной коммерции стандартно ведется на базе ASP с применением объектов СОМ. Хорошим примером является компонент Commerce Server пакета Site Server 3. Commerce Edition.

Microsoft Site Server 3, Commerce Edition

Site Server 3, Commerce Edition (SCSE) возглавляет арсенал программных средств Microsoft, предназначенных для разработки коммерческих приложений с расширенными возможностями. Site Server обладает многими возможностями, включая базовые средства программирования для системы безопасности на уровне каталогов, персональную настройку сайта, ведение базы данных зарегистрированных пользователей, анализ файлов журналов, поддержку серверов тестирования и разработки и т. д. Подобный инструментарий, построенный на базе ASP и SQL Server, позволяет создавать Web-сайты с чрезвычайно богатыми возможностями. Примерами являются сайты Dell Computers (http://www.dell.com), Martha Stewart (http://www.marthastewart.com) и Ulla Popken (http://www.ullapopken.com).

В пятой части этой книги мы рассмотрим коммерческие возможности Site Server, Commerce Edition. Следует подчеркнуть, что речь идет об иерархии объектов СОМ, которые используются в процессе, описанном в главе 1. Эти объекты СОМ построены на базе ASP. В SSCE входит несколько прототипов электронных магазинов: для традиционной розничной торговли, для операций между компаниями, для внутренних закупок и для продажи информации в цифровом виде. Основные возможности Site Server, Commerce Edition перечислены в табл. 2.6. Фирма Microsoft только что объявила о выходе новой версии их коммерческих технологий под общим названием "Commerce Server".

COMMERCE INTERCHANGE PIPELINE (CIP)

Технология С1Р (Commerce Interchange Pipeline) обеспечивает обмен электронной информацией между компаниями любого размера. CIP упаковывает и пересылает объекты данных из одного приложения в другое по локальной или глобальной сети, по сети VAN (Value-Added Network) или Интернету. Разумеется, эта технология поддерживает операции типа клиент/бизнес, однако она также обладает достаточной гибкостью и позволяет объединять системы совершенно различного уровня для проведения операций бизнес/бизнес. CIP интегрируется с существующими протоколами (в частности, электронной почтой и HTTP), распределенной моделью COM (Distributed COM, DCOM) и MSMQ (Microsoft Message Queue).

В распоряжение разработчиков CIP предоставляет интерфейсы СОМ, вследствие чего независимые фирмы могут создавать совместимые компоненты и легко объединять их в произвольные конфигурации. Архитектура CIP позволяет создавать компоненты, независимые от транспортных протоколов и конкретных форматов данных. Такие компоненты пишутся па языках типа Visual Basic или Visual C++.

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

Даже если вы собираетесь программировать только для Site Server, я все же рекомендую просмотреть части II, III и IV. Изложенный в них материал образует надежную основу для любых разработок, связанных с ASP и SQL Server. Тем, кто умеет работать на этом уровне, будет гораздо проще изучить коммерческий инструментарий Site Server.

Таблица 2.6. Основные возможности Site Server 3, Commerce Edition
Возможность
Описание
Membership Server Membership Server позволяет создавать базу данных зарегистрированных пользователей с применением соответствующих средств безопасности. В частности, система безопасности может быть основана на базе данных или на протоколе LDAP (Lightweight Directory Access Protocol), используемом платформой Windows 2000 Active Directory
Personalization Server Personalization Server ориентирует содержимое сайта на конкретного пользователя, используя при этом данные его профиля
Commerce Server (только SSCE) Инструментарий Commerce Server играет ведущую роль при построении приложений электронной коммерции. Технология CIP (Commerce Interchange Pipeline) содержит объекты СОМ для управления процессом покупки, а также может поддерживать интегрированные операции класса "бизнес/бизнес"
Ad Server (только SSCE) Ad Server управляет ходом рекламных кампаний на Web-сайтах. Полноценный интерфейс на базе Web позволяет добавлять, обновлять и удалять рекламу, а также следить за ее эффективностью

Сертификаты SSL (Secure Sockets Layer)/Verisign

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

IIS 4 поддерживает сертификаты SSL 3. Все сводится к несложной процедуре запроса сертификата на сервере и передаче запроса авторитетной службе (например, Verisign - http://www.verisign.com). Получив запрос, служба возвращает ключ, который устанавливается на сервере.

Прочие инструменты

Существует множество других инструментов, предназначенных для создания Интернет-приложений. Не только Microsoft, но и многие другие фирмы выпускают средства программирования для Windows NT и других операционных систем. Другие инструменты Microsoft перечислены в табл. 2.7.

Таблица 2.7. Инструменты Microsoft с поддержкой Web
Программа
Описание
Microsoft Exchange Server Exchange Server представляет собой мощную платформу для реализации расширенных возможностей электронной почты (целевые рассылки, почтовые ящики для поддержки клиентов и т. д.)
Microsoft FrontPage 2000 Хотя Visual InterDev поддерживает редактирование WYSIWYG (What You See Is What You Get - "что видишь, то и получаешь"), FrontPage 2000 является отличным редактором HTML для создания статического содержимого Web-сайта, также работающим в режиме WYSIWYG
Microsoft Office Microsoft Office обладает расширенными средствами для работы в Web. Microsoft Word может использоваться для создания и редактирования Web-страниц. Microsoft Access отлично работает в сочетании с Microsoft SQL Server
Internet Explorer Функции Internet Explorer не сводятся к простому отображению Web-страниц. В комплект броузера входит ряд полезных компонентов. Объекты RDS (Remote Data Service) обеспечивают работу с данными на Web-сервере через HTTP, а элементы ActiveX могут работать в интерфейсе броузера. Также имеется возможность программирования клиентских сценариев на VBScript и JScript
Visual Source Safe Visual Source Safe хранит исходные тексты программ и связанные с ними файлы в базе данных. Приложение позволяет отслеживать версию программы, а также обладает необходимой инфраструктурой для проверки программного кода на входе и выходе. Visual Source Safe особенно часто применяется для предотвращения конфликтов версий в групповых проектах
Remote Data Services (RDS) RDS предоставляет средства для запросов к базам данных через Интернет, с использованием протокола HTTP. Связь между броузером и базой данных устанавливается напрямую, без обращений к серверу для выполнения кода ASP или использования других серверных средств
Microsoft Visual Studio Выше уже упоминались два приложения, входящие в Visual Studio: Visual InterDev и Visual Source Safe. В этот пакет также входят Visual C++ и Visual J++, а также другие вспомогательные инструменты (например, Visual Modeler). Все эти приложения могут использоваться на разных стадиях процесса разработки

Проблемы совместимости броузеров

В Интернете используются два основных броузера, Internet Explorer и Netscape Navigator (или Communicator). Хотя за последнее время и наблюдается заметный рост популярности Internet Explorer, Netscape по-прежнему сохраняет за собой значительный сегмент рынка.

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

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

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

Построение функциональности

Итак, на каких же стадиях процесса электронной коммерции применяются эти инструменты? Структура процесса, рассмотренного в главе 1, описана в табл. 2.8.

Таблица 2.8. Применение инструментов Microsoft на разных фазах процесса электронной коммерции
Фаза
Описание
Маркетинг ASP, VB6, SQL
Клиент/Посетитель ASP, SQL
Посещение Web-сайта ASP, SQL
Просмотр товаров ASP, SQL
Отбор товаров ASP, SQL
Оформление заказа ASP, SQL
Вычисление налогов и стоимости доставки ASP, VB6, SQL
Оплата ASP, VB6, SQL
Построение отчета ASP, SQL
Обработка заказа ASP, SQL (состояние заказа)
Исполнение заказа ASP, SQL (состояние заказа)
Доставка ASP, SQL (состояние заказа)
Управление магазином ASP, VB6, SQL, IE

В последней части книги рассматривается инструментарий Site Server и его использование при создании функциональных средств электронной коммерции. В этом случае процесс обработки заказов будет поддерживаться за счет встроенных возможностей.

Итоги

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

Глава 3. Проектирование баз данных для коммерческих приложений

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

В этой книге используется система управления базами данных Microsoft SQL Server. Вместо нее также можно использовать Oracle и другие базы данных с поддержкой интерфейсов ODBC и OLE DB. При изложении материала программный код SQL был по возможности избавлен от привязки к конкретному серверу для того, чтобы его можно было использовать на разных платформах баз данных.

Microsoft SQL Server

SQL Server предлагается фирмой Microsoft как решение промышленного уровня в области баз данных, Microsoft Access является предложением начального уровня, предназначенным для разработки простых приложений. Осенью 1998 года появилась версия SQL Server 7, заметно усовершенствованная по сравнению с версией 6.

SQL Server - мощная платформа для построения реляционных баз данных, используемых при построении коммерческих Web-сайтов с большим объемом проводимых операций. Эта серверная технология заложена в основу таких коммерческих сайтов, как Martha Stewart (www.marthastewart.com), Electronics Boutique (www.ebworld.com) и 1-800 Flowers (www.1800flowers.com).

СОВЕТ
Хотя базы данных, описанные в этой книге, создавались на Microsoft SQL Server, они также могут использоваться в Oracle или даже Microsoft Access. Однако на этих платформах приходится вносить исправления в некоторые запросы SQL, хранимые процедуры и т. д.

Программирование SQL

Взаимодействие с SQL Server осуществляется в основном через Visual Studio, а точнее - через средства работы с базами данных, входящие в Visual InterDev и Visual Basic 6.0. В обоих продуктах предусмотрены возможности построения запросов, управления таблицами и т. д.

Для непосредственной работы с SQL Server можно воспользоваться программой SQL Enterprise Manager. Ее мощные административные средства позволяют управлять сразу несколькими серверами. При помощи SQL Enterprise Manager можно настраивать, запускать, приостанавливать и завершать экземпляры SQL Server, отслеживать текущие операции и просматривать журнал ошибок SQL Server. Вы можете создавать устройства, базы данных и т. д., управлять параметрами системы безопасности, в том числе регистрационными данными пользователей и правами доступа к базам данных. SQL Enterprise Manager и служба SQL Executive позволяют включать режим оповещения о различных серверных событиях, а также планировать выполнение сервером определенных задач. В SQL Enterprise Manager существуют графические средства для настройки и управления процессом репликации, предусмотрены возможности выполнения и анализа запросов, архивации и восстановления баз данных, автоматической генерации сценариев SQL и т. д.

Однако тонкости настройки SQL выходят за рамки этой книги. В следующей главе мы рассмотрим некоторые проблемы, связанные с применением SQL Server.

Язык Transact-SQL

Microsoft SQL Server поддерживает язык Transact-SQL, который является надмножеством SQL (Structured Query Language) - стандартного языка для построения запросов к реляционным базам данных. Язык T-SQL имеет сертификат соответствия стандарту ANSI SQL-92, однако при адаптации фрагментов, использующих нестандартные расширения, конечно, возникнут проблемы. Код SQL, написанный для этой книги, по возможности соответствует стандарту ANSI.

Проектирование базы данных

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

Разделы

На верхнем уровне абстракции товары классифицируются по разделам (departments). Например, ракетки и мячи относятся к разделу "Теннис", а щиты, обручи и сетки - к разделу "Баскетбол". В нашем примере компакт-диски распределяются по разделам в соответствии с музыкальным жанром (например, "Джаз" или "Кантри").

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

В нашем примере будет использоваться одноуровневая модель разделов. В табл. 3.1 описаны поля таблицы Department, содержащей информацию о разделах.

Таблица 3.1. Поля таблицы Department
Поле
Описание
idDepartment Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор записи в таблице разделов
chrDeptName Название раздела, отображаемое в приложении
txtDeptDesc Описание раздела, предназначенное для служебных целей или для внешнего вывода
chrDeptlmage Ссылка на графическое изображение, представляющее данный раздел

Перейдем к определению товаров.

Товары

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

Структура таблиц базы данных

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

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

Attribute - все значения атрибутов (например, красный, зеленый, X, XL). ProductAttribute - связь между товаром и его атрибутами,

AttributeCategory - категория, к которой относится конкретный атрибут (например, размер, цвет или вес).

Следует выделить еще два важных отношения: классификация товаров по разделам и необходимость отражения связей между товарами. Например, красная юбка может быть связана с красной блузкой, которая к ней хорошо подходит. Связи такого типа называются горизонтальными. Возможны и другие, вертикальные связи. Они используются в ситуациях, когда вместо дешевого товара покупателю предлагается другой, более дорогой аналог. На рис. 3.3 показаны логические связи основной таблицы товаров Products с таблицами разделов и других товаров. Любой товар может принадлежать нескольким разделам и быть связанным с несколькими товарами.

Таблица Products

Каждый товар принадлежит по крайней мере к одному разделу. В нашем примере допускается, чтобы товар принадлежал к нескольким разделам. Следовательно, понадобится отдельная таблица DepartmentProducts, содержащая информацию о принадлежности товаров к разделам. В другой таблице, RelatedProducts, хранится информация о связях между товарами. Ниже будут приведены команды SQL, которые создают эти таблицы и образуют связи между ними. Поля таблицы Products описаны в табл. 3.2.

Таблица 3.2. Поля таблицы Products
Поле
Описание
ipProduct Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор записи в таблице товаров
ChrProductName Название товара, отображаемое в приложении
txtDescription Описание товара. Информация хранится в текстовом формате, но текст может содержать теги HTML, определяющие его внешний вид
ChrProductlmage Графическое изображение. Обычно в этом поле содержится имя файла на Web-сервере, в котором находится изображение. Также поле может содержать гиперссылку на файл
intPrice Цена товара. Чтобы не возникало проблем с округлением, цена хранится в виде целого числа с двумя разрядами в дробной части
dtSaleStart Начальная дата распродажи товара
dtSaleEnd Конечная дата распродажи товара
intSalePrice Цена товара при распродаже
intActive Признак активности товара

Таблица Attribute

От полей таблицы товаров можно перейти к описанию полей таблицы атрибутов, перечисленных в табл. 3.3.

Таблица 3.3. Поля таблицы Attribute
Поле
Описание
idAttribute Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор записи в таблице атрибутов
cnrAttributeName Название атрибута, выводимое для покупателя
idAttributeCategory Ссылка на категорию, к которой относится данный атрибут

Таблица ProductAttribute

Конкретный продукт связывается со списком атрибутов при помощи таблицы ProductAttribute. Поля этой таблицы описаны в табл. 3.4.

Таблица 3.4. Поля таблицы ProductAttribute
Поле
Описание
idProductAttribute Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор для каждой комбинации
idAttribute Идентификатор атрибута
idProduct Идентификатор товара, с которым связан данный атрибут

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

Таблица AttributeCategory

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

Таблица 3.5. Поля таблицы AttributeCategory
Поле
Описание
idAttributeCategory Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор для каждой категории
chrCategoryName Название категории

В таблице просто перечисляются категории атрибутов.

ПРИМЕЧАНИЕ
Чтобы узнать, какими категориями атрибутов обладает тот или иной товар, достаточно построить запрос, который возвращает список категорий на основании набора атрибутов, присвоенных объекту. Из результатов запроса следует исключить возможные повторения.

Классификация товаров по разделам

Как уже говорилось выше, каждый товар должен быть отнесен по крайней мере к одному разделу. Впрочем, структура базы данных должна быть достаточно гибкой, чтобы товары могли принадлежать сразу нескольким разделам. Например, хотя блузка и относится к категории "Блузки", она также может быть частью раздела "Весенняя коллекция". Компакт-диск может одновременно относиться к категориям "Джаз" и "Блюз". Поля таблицы DepartmentProducts описаны в табл. 3.6.

Таблица 3.6. Поля таблицы DepartmentProducts
Поле
Описание
IdDepartmentProduct Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор для каждой комбинации
IdDepartment Идентификатор раздела
idProduct Идентификатор товара, относящегося к данному разделу

Эта таблица, как и AttributeCategory, содержит простой список комбинаций "товар/раздел".

Связывание товаров

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

Таблица 3.7. Поля таблицы RelatedProducts
Поле
Описание
IdRelatedProduct Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор для каждой комбинации
IdProductA Идентификатор товара
IdProductB Идентификатор товара, связанного с предыдущим товаром
IdRelationType Тип связи (горизонтальная или вертикальная)

Эта таблица также содержит простой список комбинаций, определяющих связи между товарами.

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

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

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

Покупатели

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

ПРИМЕЧАНИЕ
Помните: электронные магазины бывают такими же разнообразными и сложными, как и люди. У всех людей есть общие элементы (голова, сердце, тело), но по характеру и природе мы сильно отличаемся друг от друга. Вы должны хорошо понимать, какие требования предъявляются к вашему магазину и как лучше применить шаблон, описанный в книге.

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

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

Таблица с данными покупателя имеет простую структуру. Ее записи в основном состоят из реквизитов, используемых при доставке или выписке счета. Поскольку в каждом заказе присутствует идентификатор покупателя, вы можете установить соответствие между теми товарами, которые он заказывал ранее, и содержимым сайта (персональная настройка). Поля таблицы Shopper перечислены в табл. 3.8.

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

Таблица 3.8. Поля таблицы Shopper
Поле
Описание
idShopper Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор покупателя
chrFirstName Имя покупателя
chrLastName Фамилия покупателя
chrAddress Адрес
chrCity Город
chrState Штат
chrProvince Область
chrCountry Страна
chrZipCode Почтовый индекс
chrPhone Телефон
chrFax Факс
chrEmail Адрес электронной почты
dtEntered Дата ввода информации о покупателе
chrUserName Имя пользователя. Вводится покупателем при обращениях к профилю, получении информации о состоянии заказов и т.д
chrPassword Пароль. Вводится покупателем при обращениях к профилю и получении информации о состоянии заказов
intCookie Флаг проверки имени пользователя и пароля при обращении к профилю. Отказ от проверки позволяет немедленно идентифицировать пользователя, когда он в очередной раз посетит сайт со своего компьютера

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

ПРИМЕЧАНИЕ
В нашем примере данные кредитных карт не заносятся в базу данных покупателей. Вместо этого они сохраняются в отдельной таблице для каждого конкретного заказа. В дополнение к ней можно было бы создать вторичную таблицу с типами кредитных карт, сроками действия и т. д. Учтите, что покупатель может выбрать другой способ оплаты. В операциях "бизнес/бизнес" следует предусмотреть такие способы, как наложенный платеж, накладная, заказ на приобретение и т. д.

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

ПРИМЕЧАНИЕ
В данном примере не учтена возможность международных заказов, поэтому в записи отсутствуют соответствующие адресные поля.

Корзина

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

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

На рис. 3.4 изображена связь таблиц, образующих корзину, с таблицей покупателей Shopper.

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

Таблица 3.9. Поля таблицы Basket
Поле
Описание
idBasket Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор корзины
intQuantity Общее количество позиций в корзине
dtCreated Дата создания корзины
idShopper Идентификатор покупателя, создавшего корзину
intOrderPlaced Признак оформления заказа на корзину
intSubTotal Промежуточный итог без учета налогов, стоимости доставки, обработки заказа и т.д.
intTotal Общая стоимость заказа с учетом всех дополнительных сборов
intShipping Стоимость доставки заказа. Вычисляется по действующим нормам
intTax Налог на заказ. Вычисляется по действующим нормам

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

В каждой корзине присутствует список входящих в нее товаров. Информация из этого списка используется при оформлении заказа. Поля таблицы Basket-Items описаны в табл. 3.10.

Таблица 3.10. Поля таблицы BasketItems
Поле
Описание
idBasketltem Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор каждой позиции в корзине
idProduct Идентификатор товара, включенного в корзину
intPrice Цена товара на момент включения в корзину. В случае распродажи может отличаться от основной цены
chrName Название товара
intQuantity Количество заказанных единиц товара
idBasket Идентификатор корзины, к которой относится данная позиция
chrSize Значение атрибута "размер"
chrColor Значение атрибута "цвет"

СОВЕТ
Операции с таблицами, содержащими данные корзин и их отдельных позиций, являются одним из основных аспектов управления базами данных. На Web-сайтах с большим объемом сделок количество корзин может существенно превышать количество размещенных заказов. Необходимо предусмотреть возможность автоматической очистки корзин, существующих дольше заданного периода времени (например, 24 или 48 часов).

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

Заказы

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

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

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

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

Таблица 3.11. Поля таблицы OrderData
Поле
Описание
idOrder Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор заказа
idShopper Идентификатор покупателя, разместившего заказ
chrShipFirstName Имя лица, которому доставляется заказ
chrShipLastName Фамилия лица, которому доставляется заказ
chrShipAddress Адрес для доставки заказа
chrShipCity Город, в который доставляется заказ
chrShipState Штат, в который доставляется заказ. Может повлиять на величину налога и стоимости доставки
chrShipProvince Область (для международных заказов)
chrShipCountry Страна, в которую доставляется заказ
chrShipZipCode Почтовый индекс для доставки заказа. В некоторых сложных ситуациях может использоваться при вычислении налога
chrShipPhone Телефон для доставки заказа
chrShipFax Факс для доставки заказа
chrShipEmail Адрес электронной почты лица, которому доставляется заказ
chrBillFirstName Имя лица, на которое выписывается счет
chrBillLastName Фамилия лица, на которое выписывается счет
chrBillAddress Адрес для выписки счета
chrBillCity Город для выписки счета
chrBillState Штат для выписки счета
chrBillProvince Область для выписки счета
chrBillCountry Страна для выписки счета
chrBillZipCode Почтовый индекс для выписки счета
chrBillPhone Телефон для выписки счета
chrBillFax Факс для выписки счета
chrBillEmail Адрес электронной почты лица, на которое выписывается счет
dtOrdered Дата размещения заказа

ПРИМЕЧАНИЕ
Как правило, для выписки счета и доставки используется один и тот же адрес. Однако мы сохраняем эти данные дважды на случай их изменения. В интерфейсе приложения следует предусмотреть возможность однократного ввода информации в случае, если выписка счета и доставка осуществляются по одному адресу.

Затем мы должны определить таблицу для хранения платежных реквизитов покупателя. Чтобы упростить процедуру проверки, в таблице сохраняются три основных атрибута кредитной карты: тип карты, ее номер и срок действия. Поля таблицы PaymentData описаны в табл. 3.12.

Таблица 3.12. Поля таблицы PaymentData
Поле
Описание
idPayment Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор платежа
idOrder Идентификатор заказа, к которому относится платеж
chrCardType Тип кредитной карты (Visa, American Express и т.д.)
chrCardNumber Номер кредитной карты
chrExpDate Срок действия кредитной карты
chrCardName Имя владельца кредитной карты

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

Состояние заказа

В данном примере заказ может находиться на одной из трех стадий:

С каждым заказом связывается запись в таблице OrderStatus (см. рис. 3.6). Поля этой таблицы описаны в табл. 3.13.

Таблица 3.13. Поля таблицы OrderStatus
Поле
Описание
idOrderStatus Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор записи, описывающей состояние заказа
idOrder Идентификатор заказа
idStage Стадия обработки заказа
dtShipped Дата отправки (стадия 3)
dtFulfilled Дата исполнения заказа со склада (стадия 2)
dtProcessed Дата начала обработки заказа, полученного из Web (стадия 1)
txtNotes Произвольные заметки, относящиеся к состоянию заказа. Например, при возникновении каких-либо проблем информация о них заносится в это поле
chrShippingNum Номер транспортной накладной
intProcessed Признак обработки заказа для последующего исполнения

Таблица состояния заказа может иметь значительно более сложную структуру. В идеальном варианте информация о состоянии заказа принимается непосредственно от системы обработки заказов.

Стоимость доставки

Существует несколько вариантов вычисления стоимости доставки. Факторы, используемые в расчетах, перечислены в табл. 3.14.

Таблица 3.14. Факторы, используемые при вычислении стоимости доставки
Фактор
Описание
Количество единиц товара Стоимость доставки вычисляется на основании количества единиц товара, включенных в заказ. Возможные варианты - фиксированная стоимость доставки для одной единицы товара или для интервала. Например, стоимость доставки от 1 до 5 единиц составляет $3, от 6 до 10 единиц - $6 и т. д.
Общая стоимость заказа Вместо количества единиц товара стоимость доставки вычисляется на основании общей стоимости доставки. Например, при заказе на сумму от $0 до $5 стоимость доставки составляет $1, на сумму от $6 до $10 - $3 и т. д.
Вес Вес оказывается решающим фактором в ситуациях, когда товары отличаются необычно большим или непостоянным размером. Обычно в вычислениях используется специальная таблица, содержащая информацию о весе единицы товара
Расстояние доставки Вероятно, сложнее всего стоимость доставки вычисляется на основании расстояния. Вычисление расстояний на основании почтовых индексов - довольно сложная задача. В упрощенной модели задается фиксированная стоимость доставки внутри регионов и стоимость доставки между регионами. Этот способ нередко объединяется с вычислением на основе веса

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

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

Таблица 3.15. Поля таблицы Shipping
Поле
Описание
idQuantityRange Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор для каждого интервала
idLowQuantity Нижняя граница количества единиц товара в интервале
idHighQuantity Верхняя граница количества единиц товара в интервале
intFee Стоимость доставки в заданном интервале

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

Таблица 3.16. Стоимость доставки
Нижняя граница Верхняя граница Стоимость
0 5 $5.00
6 10 $7.50
11

20

$10.00
21 99999 $15.00

Обычно при такой модели определяется максимальный интервал и максимальная стоимость доставки. В нашем примере максимальный интервал задан в границах от 21 до 99 999 единиц. В другой разновидности этого способа используется формула, в которой учитывается количество заказанных единиц свыше 20.

ПРИМЕЧАНИЕ
Часто существуют специальные условия оплаты для доставки в течение одного или двух дней. Например, если покупатель хочет, чтобы товар был доставлен в течение двух дней, стоимость доставки увеличивается на $5. Чтобы товар был доставлен на следующий день, к стоимости прибавляется $10.

Налог

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

Исходя из этих требований, в таблице Tax (см. табл. 3.17) просто устанавливается прямая связь между штатом и налоговой ставкой.

Таблица 3.17. Поля таблицы Tax
Поле
Описание
idState Автоматически увеличиваемый счетчик, содержащий уникальный идентификатор для каждого штата
chrState Сокращенное название штата
intTaxRate Налоговая ставка для указанного штата

Данные, используемые в наших примерах, приведены в табл. 3.18.

Таблица 3.18. Примеры налоговых ставок
Штат
Налоговая ставка
TX 5% (0.05)

VA

10% (0.10)
DC 25%(0.25)

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

Окончательная структура базы данных

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

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

Сценарии SQL

Завершив проектирование баз данных, можно переходить к созданию сценариев SQL. Сценарии используются для создания таблиц базы данных, а также заполнения некоторых таблиц данными (ставки налогов, стоимость доставки).

ВНИМАНИЕ
Весь код SQL, приведенный в этой главе, тестировался в SQL Server 7 SP1. Хотя в SQL Server 6.5 он должен работать идентично, в других версиях могут возникнуть проблемы.

Обратите внимание - мы не создаем хранимые процедуры и другие объекты базы данных, необходимые для использования таблиц. Они будут созданы по мере изложения материала.

Первый сценарий создает таблицу Attribute. В качестве первичного ключа выбирается поле IdAttribute.

Листинг 3.1. Таблица Attribute

CREATE TABLE dbo.Attribute (
   idAttribute int IDENTITY (1, 1) NOT NULL ,
   chrAttributeName varchar (255) NULL ,
   idAttributeCategory int NULL ,
)

Листинг 3.2. Таблица AttributeCategory

CREATE TABLE dbo.AttributeCategory (
   idAttributeCategory int IDENTITY (1, 1) NOT NULL ,
   chrCategoryName varchar (255) NULL ,
)

В таблице BasketTable первичным ключом является поле idBasket. Поле dtCreated по умолчанию заполняется функцией Get Date (). Все поля, в которых должны храниться денежные величины, по умолчанию инициализируются нулями. Не забывайте инициализировать поля при создании собственной базы данных.

Листинг 3.3. Таблица Basket

CREATE TABLE dbo.Basket (
   idBasket int IDENTITY (1, 1) NOT NULL ,
   intQuantity int NULL CONSTRAINT DF_Basket_intQuantity_1__13
DEFAULT (0),
   idShopper int NULL ,
   intOrderPlaced int NULL CONSTRAINT DF_Basket_intOrderPlaced11__12
DEFAULT (0),
   intSubTotal int NULL CONSTRAINT DF_Basket_intSubTotal_13__12 DEFAULT (0),
   intTotal int NULL CONSTRAINT DF_Basket_intTotal_15__12 DEFAULT (0),
   intShipping int NULL CONSTRAINT DF_Basket_intShipping_12__12
DEFAULT (0),
   intTax int NULL CONSTRAINT DF_Basket_intTax_14__12 DEFAULT (0),
   dtCreated datetime NULL CONSTRAINT DF_Basket_dtCreated_1__12
DEFAULT (getdate()),
   intFreeShipping int NULL CONSTRAINT DF_Basket_intFreeShipping1__13
DEFAULT (0),
   CONSTRAINT PK___9__12 PRIMARY KEY CLUSTERED
   (
      idBasket
   )
)

В таблице Basketltem первичным ключом является поле idBasketltem. Полю intQuantityno умолчанию присваивается 0.

Листинг 3.4. Таблица Basketltem

 CREATE TABLE dbo.BasketItem (
   idBasketItem int IDENTITY (1, 1) NOT NULL ,
   idProduct int NULL ,
   intPrice int NULL ,
   chrName varchar (255) NULL ,
   intQuantity int NULL CONSTRAINT DF_BasketItem_intQuantity1__12 DEFAULT (0),
   idBasket int NULL ,
   chrSize varchar (50) NULL ,
   chrColor varchar (50) NULL ,
   CONSTRAINT PK___10__12 PRIMARY KEY CLUSTERED
   (
      idBasketItem
   )
)

Две следующие таблицы, Department и DepartmentProducts, определяют классификацию -оваров по разделам. В обоих случаях в качестве первичного ключа выбирается поле счетчика (identity column).

Листинг 3.5. Таблица Department

 CREATE TABLE dbo.Department (
   idDepartment int IDENTITY (1, 1) NOT NULL ,
   chrDeptName varchar (255) NULL ,
   txtDeptDesc text NULL ,
   chrDeptImage varchar (255) NULL ,
   CONSTRAINT PK___1__12 PRIMARY KEY CLUSTERED
   (
      idDepartment
   )
)

В таблице OrderStatus полю idStage присваивается 0 - признак того, что заказ еще не был обработан. Поле intPrecessed также инициализируется нулевым значением. Как только заказ будет получен и принят к исполнению, этому полю присваивается 1. Поле idOrderStatus является первичным ключом.

За таблицей OrderStatus следует таблица PaymentData. Первичным ключом в ней является поле idPayment.

Листинг 3.8. Таблица OrderStatus

 CREATE TABLE dbo.OrderStatus (
   idOrderStatus int IDENTITY (1, 1) NOT NULL ,
   idOrder int NULL ,
   idStage int NULL CONSTRAINT DF_OrderStatu_idStage_14__12 DEFAULT (0),
   dtShipped datetime NULL ,
   dtFulfilled datetime NULL ,
   dtProcessed datetime NULL ,
   txtNotes text NULL ,
   chrShippingNum varchar (30) NULL ,
   intProcessed int NULL CONSTRAINT DF_OrderStatu_intProcesse1__12 DEFAULT (0),
   CONSTRAINT PK___13__12 PRIMARY KEY CLUSTERED
   (
      idOrderStatus
   )
)

Листинг 3.9. Таблица PaymentData

 CREATE TABLE dbo.PaymentData (
   idPayment int IDENTITY (1, 1) NOT NULL ,
   idOrder int NULL ,
   chrCardType varchar (50) NULL ,
   chrCardNumber varchar (30) NULL ,
   chrExpDate varchar (25) NULL ,
   chrCardName varchar (150) NULL ,
   CONSTRAINT PK___12__12 PRIMARY KEY CLUSTERED
   (
      idPayment
   )
)

Таблица ProductAttribute связывает товары с их атрибутами. Первичным ключом этой таблицы является поле idProductAttribute.

Листинг 3.10. Таблица ProductAttribute

 CREATE TABLE dbo.ProductAttribute (
   idProductAttribute int IDENTITY (1, 1) NOT NULL ,
   idAttribute int NULL ,
   idProduct int NULL ,
   CONSTRAINT PK___4__12 PRIMARY KEY CLUSTERED
   (
      idProductAttribute
   )
)

Таблица Products содержит основную информацию о товарах. Первичным ключом этой таблицы является поле idProduct. Полям intPrice и intSalePrice по умолчанию присваивается 0. Поля dtSaleStart и dtSaleEnd инициализируются 1 января 1980 года, чтобы предотвратить случайное использование цены товара при распродаже.

Листинг 3.11. Таблица Products

 CREATE TABLE dbo.Products (
   idProduct int IDENTITY (1, 1) NOT NULL ,
   chrProductName varchar (255) NULL ,
   txtDescription text NULL ,
   chrProductImage varchar (255) NULL ,
   intPrice int NULL CONSTRAINT DF_Products_intPrice_3__12 DEFAULT (0),
   dtSaleStart datetime NULL CONSTRAINT DF_Products_dtSaleStart_2__12 DEFAULT ('1 / 1 / 80'),
   dtSaleEnd datetime NULL CONSTRAINT DF_Products_dtSaleEnd_1__12 DEFAULT ('1 / 1 / 80'),
   intSalePrice int NULL CONSTRAINT DF_Products_intSalePrice_4__12 DEFAULT (0),
   intActive int NULL CONSTRAINT DF_Products_intActive_3__12 DEFAULT (0),
   intFeatured tinyint NULL CONSTRAINT DF_Products_intFeatured_3__10 DEFAULT (0),
   dtFeatureStart datetime NULL CONSTRAINT DF_Products_dtFeatureStar2__10 DEFAULT ('1/1/80'),
   dtFeatureEnd datetime NULL CONSTRAINT DF_Products_dtFeatureEnd_1__10 DEFAULT ('1/1/80'),
   CONSTRAINT PK___2__12 PRIMARY KEY CLUSTERED
   (
      idProduct
   )
)

В таблице RelatedProducts определяются связи между товарами. Первичным ключом является поле idRelatedProduct, а все остальные поля инициализируются нулями.

Листинг 3.12. Таблица RelatedProducts

 CREATE TABLE dbo.RelatedProducts (
   idRelatedProduct int IDENTITY (1, 1) NOT NULL ,
   idProductA int NULL CONSTRAINT DF_RelatedPro_idProductA_1__12 DEFAULT (0),
   idProductB int NULL CONSTRAINT DF_RelatedPro_idProductB_2__12 DEFAULT (0),
   idRelationType int NULL CONSTRAINT DF_RelatedPro_idRelationT3__12 DEFAULT (0),
   CONSTRAINT PK___7__12 PRIMARY KEY CLUSTERED
   (
      idRelatedProduct
   )
)

В таблице Shipping хранятся данные о стоимости доставки. Первичным ключом является поле idQuantityRange, а все остальные поля инициализируются нулями.

Листинг 3.13. Таблица Shipping

 CREATE TABLE dbo.Shipping (
   idQuantityRange int IDENTITY (1, 1) NOT NULL ,
   intLowQuantity int NULL CONSTRAINT DF_Shipping_intLowQuantit3__12 DEFAULT (0),
   intHighQuantity int NULL CONSTRAINT DF_Shipping_intHighQuanti2__12 DEFAULT (0),
   intFee int NULL CONSTRAINT DF_Shipping_intFee_1__12 DEFAULT (0),
   CONSTRAINT PK___14__12 PRIMARY KEY CLUSTERED
   (
      idQuantityRange
   )
)

В таблице Shopper хранятся данные о покупателях. Поле dtEntered инициализируется функцией GetDate(), то есть датой создания записи о покупателе. Полю intCookie присваивается 0 - признак того, что идентификатор покупателя не должен сохраняться при помощи cookie. Поле idShopper является первичным ключом.

Листинг 3.14. Таблица Shopper

 CREATE TABLE dbo.Shopper (
   idShopper int IDENTITY (1, 1) NOT NULL ,
   chrFirstName varchar (50) NULL ,
   chrLastName varchar (50) NULL ,
   chrAddress varchar (150) NULL ,
   chrCity varchar (100) NULL ,
   chrState varchar (2) NULL ,
   chrZipCode varchar (15) NULL ,
   chrPhone varchar (30) NULL ,
   chrFax varchar (30) NULL ,
   chrEmail varchar (150) NULL ,
   chrUserName varchar (25) NULL ,
   chrPassword varchar (25) NULL ,
   intCookie tinyint NULL CONSTRAINT DF_Shopper_intCookie_1__12 DEFAULT (0),
   dtEntered datetime NULL CONSTRAINT DF_Shopper_dtEntered_1__12 DEFAULT (getdate()),
   chrProvince varchar (150) NULL ,
   chrCountry varchar (150) NULL ,
   CONSTRAINT PK___8__12 PRIMARY KEY CLUSTERED
   (
      idShopper
   )
)

Таблица Tax содержит информацию о ставке налога в различных штатах. Первичным ключом является поле idState, а полю intTaxRate по умолчанию присваивается 0.

Листинг 3.15. Таблица Tax

 CREATE TABLE dbo.Tax (
   idState int IDENTITY (1, 1) NOT NULL ,
   chrState varchar (50) NULL ,
   fltTaxRate float NULL CONSTRAINT DF_Tax_fltTaxRate_1__13 DEFAULT (0),
   CONSTRAINT PK___15__12 PRIMARY KEY CLUSTERED
   (
      idState
   )
)

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

Итоги

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

Глава 4. Конфигурация системы

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

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

ПРИМЕЧАНИЕ
Предполагается, что с позиций бизнеса ваша организация уже готова к электронной продаже своих товаров и/или услуг.

Проектирование серверного комплекса

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

Web-серверы

Работа электронного магазина обеспечивается Web-сервером, находящимся под управлением Windows NT. В наших примерах, основанных на ASP и Visual Basic, им будет Internet Information Server 4.0. Для работы примеров, рассмотренных в конце книги, на Web-сервере также необходимо установить Site Server Commerce Edition.

СОВЕТ
Обычно Web-сайт не ограничивается функциями электронного магазина. Другие его возможности могут быть в большей степени ориентированы на специфику его содержания, а также не обязательно связаны с коммерцией.

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

Таблица 4.1. Требования к конфигурации электронного магазина
Требование
Описание
Интерфейс управления электронным магазином Интерфейс управления создается в процессе проектирования магазина. Ключевым фактором является безопасность, поэтому URL интерфейса управления (например, http://admin.ecstore.com) должен отличаться от интерфейса пользовательского сайта (например, http://www.ecstore.com). Безопасность может быть реализована несколькими способами. При защите на уровне каталогов может использоваться механизм аутентификации NT Challenge and Response. Как будет показано ниже, система безопасности также может быть реализована на уровне базы данных
Безопасность SSL Механизм SSL (Secure Sockets Layer) обеспечивает шифрование конфиденциальной информации при обмене данными между броузером и сервером
Связь с базой данных Если сервер базы данных находится на другом компьютере, на Web-сервере электронного магазина должно существовать подключение ODBC к базе данных. Также предполагается наличие постоянного сетевого доступа к серверу базы данных

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

Web-сервер

Если наряду с сервером электронного магазина создается другой, дополнительный Web-сервер, он настраивается практически так же, как и коммерческий Web-сервер. Главное требование заключается в наличии удобной ссылки на Web-магазин. Хорошим примером является Американская ассоциация борьбы с диабетом. Ее главный Web-сайт расположен по адресу http://www.diabetes.org, а электронный магазин - по адресу http://merchant.diabetes.org.

Сервер базы данных

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

Поддержка нескольких серверов

Как упоминалось выше, в простейшем варианте Web-сайт представляет собой один Web-сервер, на котором сосредоточены все функциональные средства (см. рис. 4.1). На следующем уровне детализации (см. рис. 4.2) Web-сервер отделяется от сервера базы данных. В этом случае серверный комплекс состоит из двух серверов. Следующая проблема возникает в ситуации, когда необходимый объем операций обеспечивается несколькими Web-серверами и серверами базы данных, как показано на рис. 4.3. Хотя основные принципы программирования и функциональность базы данных остаются прежними, возникают такие проблемы, как синхронизация данных, синхронизация содержания, распределение нагрузки и т. д. Их подробное рассмотрение выходит за рамки книги, однако перед запуском Web-сайта с потенциально высоким объемом операций эти проблемы необходимо тщательно проанализировать.

СОВЕТ
На стадии разработки вся функциональность вполне может быть сосредоточена на одном сервере. Однако впоследствии вы должны провести тестирование полного серверного комплекса и убедиться в правильной работе связей между серверами.

ВНИМАНИЕ
Если в конфигурации с несколькими серверами возникла необходимость в распределении нагрузки, то вам, вероятно, придется создать дополнительные средства для передачи Web-запросов на разные серверы. Также необходимо проследить за тем, чтобы на протяжении всего сеанса покупатель взаимодействовал с одним и тем же сервером (тем, на который он был направлен изначально). Если запросы клиента будут попадать на разные Web-серверы, уследить за состоянием его корзины и другими важными данными будет практически невозможно.

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

Серверы разработки и тестирования

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

Сервер тестирования используется для проверки обновлений серверного комплекса Web-сайта. Фаза тестирования чрезвычайно важна при частом обновлении сайта, особенно в конфигурации с несколькими серверами. При значительных модификациях сайта следует провести испытания нагрузки и убедиться в том, что новая конфигурация не будет подвержена сбоям при полной рабочей нагрузке.

Управление серверами

Многие традиционные проблемы управления серверным комплексом в модели "клиент/сервер" возникают и при управлении комплексами Web-серверов. Среди ключевых факторов нормального процесса разработки и текущего функционирования сайта - контроль над исходными текстами, архивация и т. д. В этом разделе будут рассмотрены некоторые из этих факторов. Кроме того, мы познакомимся с основными принципами построения Web-сайта, чтобы в следующей главе перейти непосредственно к программированию.

Среда разработки

Электронные магазины строятся практически на тех же принципах, что и традиционные приложения "клиент/сервер", предназначенные для внутреннего использования. Решающее значение имеют хорошие навыки программирования и правильный выбор инструментов.

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

При создании Web-серверов из области электронной коммерции действует одно специфическое требование - вся работа с файлами исходных текстов должна происходить на центральном сервере разработки. На рис. 4.4 изображена базовая диаграмма процесса работы в Visual InterDev на Web-сервере разработки.

В этих условиях разработчик подключается к Web-серверу через Visual InterDev. На Web-сервере должны быть установлены расширения FrontPage для IP-адреса рабочего Web-сайта. В дальнейшем по этому адресу подключается InterDev.

Конфигурация Web-сервера

Для создания среды разработки необходимо выполнить некоторые действия по настройке Internet Information Server и расширений FrontPage, а также подключению через Visual InterDev.

1. Запустите Internet Information Server. Для управления процессами на сервере применяется ММС (Microsoft Management Console). В данном случае используются snap-ins1 для настройки различных служб Интернета, в том числе FTP, HTTP и SMTP. Окно ММС изображено на рис. 4.5.

Рис. 4.5. Окно MMC с загруженными plug-ins IIS

Программа администрирования, поддерживаемая ММС (Microsoft Management Console). К примеру, MTS Explorer в Windows NT. - Примеч. ред.

2. Следующей задачей является настройка Web-сайта. В примерах этой книги будет использоваться Web-сайт, создаваемый IIS по умолчанию. Вы можете создать новый Web-сайт и присвоить ему IP-адрес. Панель настройки Web-сайта изображена на рис. 4.6. Локальному Web-сайту соответствует IP-адрес 127.0.0.1.

3. Для нормальной настройки Web-сайта также необходимо задать домашний каталог. Панель для ввода домашнего каталога показана на рис. 4.7. Флажок FrontPage Web должен быть установлен, чтобы сайт поддерживал расширения FrontPage. Остальным параметрам можно оставить значения по умолчанию.

4. На этом основная настройка Web-сайта завершается. Теперь на сайте необходимо установить расширения FrontPage. Запустите программу FrontPage Server Administrator, входящую в группу Windows NT 4 Option Pack.

Выберите в списке созданный Web-сайт. Затем нажмите кнопку Install, чтобы установить расширения на Web-сервере.

5. Теперь к Web-сайту можно подключаться через Visual InterDev. На рис. 4.9 изображено окно InterDev при запуске. Чтобы создать новый проект, перейдите на вкладку New и выберите категорию Visual InterDev Projects. Присвойте проекту имя.

6. Visual InterDev предложит ввести IP-адрес Web-сайта, к которому вы хотите подключиться. Для локальных сайтов на Web-сервере используется IP-адрес 127.0.0.1 или имя localhost.

7. После выбора Web-сайта Visual InterDev спросит, к какому Web-приложению вы хотите подключиться. В нашем примере будет создано новое приложение с именем ECStore..

8. На этом процесс подключения к Web-сайту завершается. При создании нового Web-приложения создается новый файл global.asа. Этот файл содержит глобальные параметры и процедуры уровня сеанса нашего Web-приложения. На этой стадии можно начинать работу над Web-сайтом.

Архивация сервера

Архивация серверных данных всегда важна. Вероятно, на Web-серверах она играет еще более заметную роль, что обусловлено транзакционной природой Web-сайта и необходимостью работы по схеме 24x7x365. Основные архивируемые объекты перечислены в табл. 4.2.

Таблица 4.2. Архивируемые объекты на Web-сервере
Объект
Описание
Страницы ASP и другие ключевые файлы Конечно, программный код, графика, страницы HTML другие файлы Web-сайта необходимо часто архивировать. Резервные копии следует хранить в течение некоторого времени на случай, если потребуется реконструировать старое содержимое сайта
Объекты СОМ Бизнес-объекты, которые мы будем создавать на Visual Basic 6, также необходимо регулярно архивировать. При этом должны архивироваться и исходные тексты этих объектов (хранящиеся в Visual SourceSafe)
Сертификаты SSL В процессе архивации часто упускается необходимость создания резервных копий сертификатов SSL. При утрате сертификатов остается единственный выход - запросить новые сертификаты
ODBC DSN Еще один объект, о котором часто забывают при архивации - параметры ODBC DSN на Web-сервере. Если вы используете файловые DSN, возможна непосредственная архивация источников данных
Параметры конфигурации IIS При внесении изменений в стандартную конфигурацию IIS необходимо сохранить эти изменения на случай восстановления Web-сервера
Параметры конфигурации SQL Server To, что говорилось выше о параметрах IIS, относится и к параметрам конфигурации SQL Server
Операционная система и другие файлы сервера Как и при любой стандартной архивации, обеспечивающей быстрое восстановление, вся система также должна регулярно архивироваться

Безопасность

Как упоминалось выше в этой главе, безопасность является одним из ключевых факторов настройки Web-сайта. Безопасность может обеспечиваться средствами IIS непосредственно на уровне Web. Другой подход заключается в реализации безопасности на уровне базы данных и запрете доступа к содержимому сайта через ASP.

Панель безопасности Web-сайта в IIS. Как правило, для предоставления всеобщего доступа к Web-сайту используется анонимный доступ. Если возникает необходимость в дополнительной защите некоторого виртуального узла или каталога, можно реализовать базовую аутентификацию или механизм Windows NT Challenge/Response. При базовой аутентификации пароль пересылается по Интернету в виде незашифрованного- текста. В механизме Windows NT Challenge/Response доступ к Web-сайту осуществляется средствами Internet Explorer. В любом случае пользователю предлагается ввести имя и пароль в диалоговом окне.

В вопросах безопасности существенное внимание также уделяется управлению сертификатами SSL. В основном интерфейсе управляющей консоли IIS присутствует значок Key Manager. Если щелкнуть на нем, откроется окно Key Manager.

В Key Manager можно создать новый ключ, установить сертификаты, полученные от авторитетной службы (например, Verisign), а также импортировать и архивировать сертификаты.

Настройка базы данных

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

Таблица 4.3. Факторы конфигурации базы данных
Фактор
Описание
Пиковая нагрузка Зачастую на Web-сайтах возникают пики активности, приводящие к значительно большему расходу ресурсов, чем при повседневной работе. Праздники, рекламные распродажи и другие события могут заметно повысить нагрузку. Убедитесь в том, что Web-сервер справляется с возросшим числом подключений и объектов данных. Эти факторы влияют на требования к конфигурации сервера
Дисковое пространство Журналы транзакций и другие служебные файлы, а также сами данные, полученные из Web, влияют на требования к объему дискового пространства. Вы должны организовать постоянное наблюдение за эффективным использованием дисков и т. д.
Поддержка нескольких серверов При наличии нескольких серверов баз данных в процессе базового проектирования системы необходимо учесть проблемы синхронизации данных товаров, заказов, пользовательских профилей и другой информации

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

Таблица 4.4. Сценарии архивации и репликации на серверах баз данных
Сценарий
Описание
Создание резервных копий устройств Простая еженощная архивация устройств на ленте обеспечивает простейшие потребности в архивации. Единственным недостатком такого сценария является отсутствие архивации в реальном времени, обеспечивающей восстановление нормальной работы Web-сайта без сколько-нибудь заметных простоев
Теплая архивация Существуют различные сценарии "теплой архивации" (warm backup), при которой содержимое базы данных архивируется или реплицируется через некоторый период времени (обычно час или меньше). Если сервер базы данных вдруг перестает работать, простая перенастройка параметров ODBC позволяет восстановить работу Web-узла с момента последней теплой архивации
Репликация в реальном времени Самый лучший вариант - репликация данных между серверами в реальном времени. Реализация такого варианта на сервере базы данных требует существенного планирования распределения ресурсов в зависимости от текущего уровня операций

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

Планирование нагрузки

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

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

Требования к броузеру

Наконец, одним из ключевых факторов планирования системы является хорошее понимание тех требований, которые предъявляются к броузеру со стороны системы. Хотя эти требования в значительной степени обусловлены архитектурой системы, при кодировании сайта с применением расширенных возможностей броузера (например, ActiveX и DHTML) они могут повлиять на выбор типа броузера. Примером этого является программа управления электронным магазином, ориентированная на использование конкретного броузера с расширенными возможностями. Иногда для применения механизма Windows NT Challenge/ Response требуется Internet Explorer. Реже возникает необходимость в службах RDS (Remote Data Services) броузера Internet Explorer.

Итоги

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

Глава 5. Пример приложения

Прежде чем с головой погрузиться в процесс разработки электронного магазина на основе концепций проектирования баз данных, описанных в главе 3, мы построим очень простое коммерческое приложение с использованием технологий Active Server Pages и SQL Server. Это поможет вам лучше освоиться со средой разработки ASP.

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

Построение таблицы данных

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

Листинг 5.1. Таблица с данными о подписчиках

 CREATE TABLE dbo.Subscriptions (
   idSubscription int IDENTITY (1, 1) NOT NULL ,
   chrFirstName varchar (100) NULL ,
   chrLastName varchar (100) NULL ,
   chrAddress varchar (150) NULL ,
   chrCity varchar (100) NULL ,
   chrState varchar (10) NULL ,
   chrZipCode varchar (15) NULL ,
   chrPhone varchar (25) NULL ,
   chrEmail varchar (100) NULL ,
   chrCardType varchar (50) NULL ,
   chrCardNumber varchar (25) NULL ,
   chrExpDate varchar (50) NULL ,
   intProcessed tinyint NULL CONSTRAINT DF_Subscripti_intProcesse3__12 DEFAULT (0),
   dtEntered datetime NULL CONSTRAINT DF_Subscripti_dtEntered_2__12 DEFAULT (getdate()),
   intLength tinyint NULL ,
   chrCardName varchar (150) NULL ,
   CONSTRAINT PK___1__12 PRIMARY KEY CLUSTERED
   (
      idSubscription
   )
)

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

Построение формы HTML

Откройте проект, созданный в главе 4. Щелкните правой кнопкой мыши на имени проекта в окне проекта и выберите в контекстном меню команду Add. В открывшемся подменю выберите Active Server Page. Введите в диалоговом окне имя ASP-страницы подписки, subscription.asp.

В результате на Web-сервере создается новый файл. Теперь можно приступать к построению HTML-структуры страницы. При создании страницы ASP генерируется базовый шаблон, который далее редактируется в Visual InterDev. В вашем распоряжении три режима просмотра: Design, Source и Quick View. Как правило, в процессе разработки используется режим просмотра исходного текста Source. Режим Design View предназначен для построения HTML в режиме WYSIWYG (What You See Is What You Get - что видите, то и получаете). Режим Quick View используется для просмотра HTML в интерфейсе броузера, но без обработки программного кода ASP.

Чтобы построить страницу HTML, необходимо создать форму HTML и разместить на ней элементы HTML Затем мы построим сценарную страницу для обработки данных, введенных пользователем.

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

СЕАНСОВЫЕ ПЕРЕМЕННЫЕ
В стандартной Web-технологии не существует простых средств для сохранения данных состояния между Web-страницами. Например, если пользователь где-то ввел свой почтовый индекс и продолжает просматривать остальные страницы сайта, вам придется немало потрудиться для отслеживания этих данных по URL или с применением скрытых элементов HTML. К счастью, в IIS/ASP Microsoft реализовала возможность создания сеансовых переменных. Все, что от вас требуется - присвоить значение переменной на одной странице и затем читать его по мере необходимости на других страницах. Учтите, что сеансовые переменные существуют в течение интервала тайм-аута, по умолчанию равного 30 минутам. В действительности мы никогда не знаем точно, когда посетитель покинул сайт, поэтому при отсутствии операций в течение заданного периода тайм-аута сеансовые данные пропадают.

Листинг 5.2. Страница subscription.asp

<%@ Language=VBScript %>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>

<BR><BR>

<center>

<!-- Setup the Header -->
<font size="4" color="blue"><b>
XYZ Publication
</b></font>

<!-- Start the form that will post to the
ProcessSub.asp page. -->
<form method="post" action="ProcessSub.asp">

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

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

Листинг 5.3. subscription.asp (продолжение)

<!-- Next the table starts that will layout the
data entry form
-->
<table border=1>

<!-- Subscription Length -->
<tr>
<td align="right">Subscription Length:</td>
<td>
<%
' Check to see if a length was set. If so
' then default the radio button selected.
if session("intLength") = "1" then
CheckOne = "Checked"
Flag = 1
end if

if session("intLength") = "2" then
CheckTwo = "Checked"
Flag = 1
end if

if session("intLength") = "3" then
CheckThree = "Checked"
Flag = 1
end if

' If this is the first time the form is
' displayed in the session then default to
' a length of one year.
if Flag <> 1 then CheckOne = "Checked"

%>
<!-- Radio buttons for selecting the length -->
<input type="radio" value="1" name="intLength" <%=CheckOne%>>One Year
<input type="radio" value="2" name="intLength" <%=CheckTwo%>>Two Year
<input type="radio" value="3" name="intLength" <%=CheckThree%>>Three Year
</td>
</tr>

<!-- First Name -->
<tr>
<td align="right">First Name:</td>
<!-- Input field for the first name -->
<td><input type="text" value="<%=session("chrFirstName")%>" name="chrFirstName"></td>
</tr>

<!-- Last Name -->
<tr>
<td align="right">Last Name:</td>
<!-- Input field for the last name -->
<td><input type="text" value="<%=session("chrLastName")%>" name="chrLastName"></td>
</tr>

<!-- Address -->
<tr>
<td align="right">Address:</td>
<!-- Input field for the address -->
<td><input type="text" value="<%=session("chrAddress")%>" name="chrAddress"></td>
</tr>

<!-- City-->
<tr>
<td align="right">City:</td>
<!-- Input field for the city -->
<td><input type="text" value="<%=session("chrCity")%>" name="chrCity"></td>
</tr>

<tr>
<td align="right">State:</td>
<td><input type="text" value="<%=session("chrState")%>" name="chrState" size=2></td>
</tr>

<!-- Zip Code -->
<tr>
<td align="right">Zip Code:</td>
<!-- Input field for the zip code -->
<td><input type="text" value="<%=session("chrZipCode")%>" name="chrZipCode"></td>
</tr>

<!-- Phone Number -->
<tr>
<td align="right">Phone:</td>
<!-- Input field for the phone number -->
<td><input type="text" value="<%=session("chrPhone")%>" name="chrPhone"></td>
</tr>

<!-- Email Address -->
<tr>
<td align="right">Email Address:</td>
<!-- Input field for the email address -->
<td><input type="text" value="<%=session("chrEmail")%>" name="chrEmail"></td>
</tr>

<!-- Name on Card -->
<tr>
<td align="right">Name on Card:</td>
<!-- Input field for the email address -->
<td><input type="text" value="<%=session("chrCardName")%>" name="chrCardName"></td>
</tr>

Тип кредитной карты обрабатывается примерно так же, как срок подписки. Если пользователь выбрал карту Master Card или American Express, то при возвращении к форме мы восстанавливаем его выбор.

Листинг 5.4. subscription.asp (продолжение)

<!-- Input field for the credt card type -->
<tr>
<td align="right">Card Type:</td>
<td>

<%

' Check to see which card was selected previously
' if there was an error.
if session("chrCardType") = "Visa" then
SelVisa = "Selected"
end if

if session("chrCardType") = "MasterCard" then
SelMC = "Selected"
end if

if session("chrCardType") = "AmEx" then
SelAmEx = "Selected"
end if
%>

<!-- Select box for the type of cards -->
<select name="chrCardType">
<option value="Visa" <%=SelVisa%> >Visa
<option value="MasterCard" <%=SelMC%>>Master Card
<option value="AmEx" <%=SelAmEx%>>American Express
</select>

</td>
</tr>

<!-- Credit Card Number -->
<tr>
<td align="right">Card Number:</td>
<!-- Input field for teh credt ciard number -->
<td><input type="text" value="<%=session("chrCardNumber")%>" name="chrCardNumber"></td>
</tr>

<!-- Credit card experiation date -->
<tr>
<td align="right">Expiration Date:</td>
<!-- Input field for the expiration date -->
<td><input type="text" value="<%=session("chrExpDate")%>" name="chrExpDate"></td>
</tr>

В последнем фрагменте страницы создается кнопка HTML типа Submit, передающая серверу данные формы. Затем форма и страница закрываются соответствующими тегами.

Листинг 5.5. subscription.asp (продолжение)

<!-- Submit button -->
<tr>
<td colspan="2" align="center">
<input type="submit" value="Subscribe!" name="submit">
</td>
</tr>

</table>

</center>

<!-- Closing tag for the end of the form -->
</form>

</BODY>
</HTML>

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

Программирование сценария

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

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

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

Страница ProcessSub.asp, как и subscription.asp, начинается с основных тегов ITML. В листинге 5.6 показано начало страницы.

Листинг 5.6. Страница ProcessSub.asp

<%@ Language=VBScript %>

<HTML>

<BODY BGCOLOR="WHITE">

Наша первая задача - чтение данных из формы. Для получения данных по именам полей формы используется объект Request. Прочитанные данные сохраняются в переменных для последующего использования.

ПРИМЕЧАНИЕ
Сохранять переменные в данных формы необязательно - вы можете использовать объект Request на всей странице. Впрочем, переменные упрощают последующую обработку данных.

Листинг 5.7. ProcessSub.asp (продолжение)

<%

' Retrieve all of the data that the user entered
' by using the request object.
intLength = request("intLength")
chrFirstName = request("chrFirstName")
chrLastName = Request("chrLastName")
chrAddress = Request("chrAddress")
chrCity = Request("chrCity")
chrState = Request("chrState")
chrZipCode = Request("chrZipCode")
chrPhone = Request("chrPhone")
chrEmail = Request("chrEmail")
chrCardName = Request("chrCardName")
chrCardType = Request("chrCardType")
chrCardNumber = Request("chrCardNumber")
chrExpDate = Request("chrExpDate")

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

Листинг 5.8. ProcessSub.asp (продолжение)

' Check to see if the first name was entered.
if chrFirstName = "" then

' Give an error if not.
strError = "You did not enter in your first name.<BR>"

end if

' Check to see if a last name was entered.
if chrLastName = "" then

strError = strError & "You did not enter in your last name.<BR>"

end if

' Check to see if an address was entered
if chrAddress = "" then

strError = strError & "You did not enter in your address.<BR>"

end if

' Check to see if a city was entered.
if chrCity = "" then

strError = strError & "You did not enter in your city.<BR>"

end if

' Check to see if the state was entered of if the length
' is more than two characters.
if chrState = "" or len(chrState) > 2 then

strError = strError & "You did not enter in a valid state.<BR>"

end if

' Check to see if a zip code was entered.
if chrZipCode = "" then

strError = strError & "You did not enter in your zip code.<BR>"

end if

' Check to see if the card name was entered.
if chrCardName = "" then

strError = strError & "You did not enter in the name on your credit card.<BR>"

end if

' Check to see if the card number was entered
if chrCardNumber = "" then

strError = strError & "You did not enter in your credit card number.<BR>"

end if

' Check to see if the card expiration date was entered
if (chrExpDate = "") or (isdate(chrExpDate) = false) then

strError = strError & "You did not enter in a valid credit card expiration date.<BR>"

end if

После проверки даты все готово к выполнению намеченных действий. Мы проверяем переменную strErrorn смотрим, было ли ей присвоено значение. Если переменная содержит текст, значит введенные данные содержат ошибку. Если переменная равна пустой строке, ошибки не было.

' Проверить, были ли обнаружены ошибки
if strError <> "" then

%>

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

<!-- Note the error -->
<B><font color="red">
There is an error in your subscription request:<BR><BR>
</b></font>

<%

' Write out the error messages
Response.Write strError

%>

<!-- Link back to the subscription page -->
<BR>
Click <a href="subscription.asp">here</a> to update.

<%

' Set session variables to the subscription form can be
' re-populated
Session("intLength") = request("intLength")
Session("chrFirstName") = request("chrFirstName")
Session("chrLastName") = Request("chrLastName")
Session("chrAddress") = Request("chrAddress")
Session("chrCity") = Request("chrCity")
Session("chrState") = Request("chrState")
Session("chrZipCode") = Request("chrZipCode")
Session("chrPhone") = Request("chrPhone")
Session("chrEmail") = Request("chrEmail")
session("chrCardName") = Request("chrCardName")
Session("chrCardType") = Request("chrCardType")
Session("chrCardNumber") = Request("chrCardNumber")
Session("chrExpDate") = Request("chrExpDate")

else

%>

Если все данные верны, можно переходить к обработке формы. Страница выводит благодарственное сообщение и краткую сводку данных формы.

Листинг 5.9. ProcessSub.asp (продолжение)

<!-- Thank the customer for the order -->
<font size="4" color="blue">Thank you for your order!
It will be processed immediately.</font>

<!-- Redisplay the data entered into the subscription -->
<BR><BR>
<Table>
<tr><td align="right"><B>Name:</b></td>
<td><i> <% = chrFirstName & " " & chrLastName %></i></td></tr>

<tr><td align="right"><B>Address:</b></td>
<td><i> <% = chrAddress %></i></td></tr>

<tr><td align="right"><B>City:</b></td>
<td><i> <% = chrCity %></i></td></tr>

<tr><td align="right"><B>State:</b></td>
<td><i> <% = chrState %></i></td></tr>

<tr><td align="right"><B>Zip Code:</b></td>
<td><i> <% = chrZipCode %></i></td></tr>

<tr><td align="right"><B>Phone:</b></td
><td><i> <% = chrPhone %></i></td></tr>

<tr><td align="right"><B>Email:</b></td>
<td><i> <% = chrEmail %></i></td></tr>

<tr><td align="right"><B>Card Name:</b></td>
<td><i> <% = chrCardName %></i></td></tr>

<tr><td align="right"><B>Card Type:</b></td>
<td><i> <% = chrCardType %></i></td></tr>

<tr><td align="right"><B>Card Number:</b></td>
<td><i> <% = chrCardNumber %></i></td></tr>

<tr><td align="right"><B>Expiration Date:</b></td>
<td><i> <% = chrExpDate %></i></td></tr>

</ul>

Все готово к следующей важной операции - занесению данных в базу. Первым шагом является создание объекта подключения ADO к базе данных. Для подключения к базе потребуется ODBC DSN - не забудьте создать его. Обратите внимание на то, что хотя в данном примере и используется файловый DSN, вместо него вполне можно создать системный DSN. Учтите, что пользовательские DSN работают только в контексте пользователя, для которого они были созданы, что делает их непригодными для использования в IIS.

Затем необходимо провести предварительную обработку данных для занесения в базу. Все одиночные апострофы удваиваются, чтобы они правильно заносились в базу и не были ошибочно приняты за разделители. Эта проблема возникает в фамилиях (например, О'Брайен), названиях городов, адресах и т. д. Команда Rep! асе легко заменяет эти одиночные апострофы двойными. В нашем примере проверяются поля имени, фамилии, адреса, владельца кредитной карты и города.

СОВЕТ
SQL Server интерпретирует два апострофа, идущих подряд, как один символ. Все апострофы внутри строковых данных, сохраняемых в полях, необходимо удвоить. Значения, вставляемые в базу, должны начинаться с одиночного апострофа и заканчиваться одиночным апострофом.

После подготовки данных мы строим команду SQL для занесения данных в базу. Затем построенная команда SQL выполняется страницей.

Листинг 5.10. ProcessSub.asp (продолжение)

<%

' Create an ADO database connection
set dbSubs = server.createobject("adodb.connection")

' Open the connection using our ODBC file DSN
dbSubs.open("filedsn=SubForm")

' If any of our names have a single quote, we will
' need to double it to insert it into the database
chrFirstName = replace(chrFirstName, "'", "''")
chrLastName = replace(chrLastName, "'", "''")
chrAddress = replace(chrAddress, "'", "''")
chrCardName = replace(chrCardName, "'", "''")
chrCity = replace(chrCity, "'", "''")

' SQL insert statement to insert the subscription
' data into the database
sql = "insert into subscriptions(" & _
"chrFirstName, " & _
"chrLastname, " & _
"chrAddress, " & _
"chrCity, " & _
"chrState, " & _
"chrZipCode, " & _
"chrPhone, " & _
"chrEmail, " & _
"chrCardName, " & _
"chrCardType, " & _
"chrCardNumber, " & _
"chrExpDate, " & _
"intLength) " & _
"values (" & "'" & _
chrFirstName & "', '" & _
chrLastName & "', '" & _
chrAddress & "', '" & _
chrCity & "', '" & _
chrState & "', '" & _
chrZipCode & "', '" & _
chrPhone & "', '" & _
chrEmail & "', '" & _
chrCardName & "', '" & _
chrCardType & "', '" & _
chrCardNumber & "', '" & _
chrExpDate & "', " & _
intLength & ")"

' Execute the SQL statement
dbSubs.execute(sql)

end if

%>

</body>

</html>

На этом программирование на стороне пользователя закончено. В части 3 мы рассмотрим процесс загрузки введенных данных средствами Web.

Тестирование приложения

Перейдем к тестированию приложения. При вызове страницы subscription, asp на Web-сервере загружается Web-страница, показанная на рис. 5.2.

Заполните форму данными. Некоторые данные следует ввести с ошибками, чтобы мы могли протестировать обработку ошибок. На рис. 5.3 показана форма с примерными данными. Обратите внимание на неверно заданный срок действия карты. Завершив ввод данных, нажмите кнопку Subscribe, чтобы передать форму странице ProcessSub.asp.

Страница ProcessSub.asp обрабатывает введенные данные. Если все было сделано правильно, в броузере появляется сообщение об ошибке, допущенной при вводе срока действия карты. Это сообщение показано на рис. 5.4.

Щелкните на ссылке и вернитесь к странице подписки. При этом форма заново заполняется данными подписчика. На рис. 5.5 показана правильно заполненная форма.

СОВЕТ
Имена полей, содержащих ошибочные данные, можно выделить красным цветом.

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

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

Управление приложением

Последним компонентом нашего приложения является отчетная форма. Она предназначена для построения отчета о подписке, оформленной с момента последней обработки данных. Кроме того, форма дает возможность пометить текущие данные подписки как обработанные. Начало страницы SubReport.asp приведено в листинге 5.11.

Листинг 5.11. SubReport.asp

<%@ Language=VBScript %>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>

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

Листинг 5.12. SubReport.asp (продолжение)

<%

' Create an ADO database connection
set dbSubs = server.createobject("adodb.connection")
set rsSubs = server.CreateObject("adodb.recordset")

' Open the connection using our ODBC file DSN
dbSubs.open("filedsn=SubForm")

' Retrieve any subscription IDs on the URL
idSubscription = Request("idSubscription")

' Check to see if there is a value.
if idSubscription <> "" then

' Built an SQL update statement to process teh subs.
sql = "update subscriptions set intProcessed = 1 where idSubscription <= " & _
idSubscription

' Execute the SQL statement
dbSubs.execute sql

end if

На следующем шаге мы читаем всю необработанную подписку. Страница строит команду SQL с соответствующей секцией WHERE. В результате выполнения команда возвращает набор записей.

' Построить команду SQL для чтения всех необработанных данных подписки
sql = "select * from subscriptions where intProcessed = 0"

' Выполнить команду и получить набор записей
set rsSubs = dbSubs.Execute(sql)

%>

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

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

Листинг 5.13. SubReport.asp (продолжение)

<!-- Start the table to display the subs. -->
<Table border="1">

<%

' Check to see if no subs are returned
if rsSubs.EOF then

' If so, then write
Response.Write "No subscriptions to report."

else

' Loop through the subs
do until rsSubs.eof

%>

<!-- Display the subscription data -->
<TR>
<TD align="right">First Name:</TD>
<TD> <%=rsSubs("chrFirstName")%></TD>
</TR>

<TR>
<TD align="right">Last Name:</TD>
<TD> <%=rsSubs("chrLastName")%></TD>
</TR>

<TR>
<TD align="right">Address:</TD>
<TD> <%=rsSubs("chrAddress")%></TD>
</TR>

<TR>
<TD align="right">City:</TD>
<TD> <%=rsSubs("chrCity")%></TD>
</TR>

<TR>
<TD align="right">State:</TD>
<TD> <%=rsSubs("chrState")%></TD>
</TR>

<TR>
<TD align="right">Zip Code:</TD>
<TD> <%=rsSubs("chrZipCode")%></TD>
</TR>

<TR>
<TD align="right">Phone:</TD>
<TD> <%=rsSubs("chrPhone")%></TD>
</TR>

<TR>
<TD align="right">Email:</TD>
<TD> <%=rsSubs("chrEmail")%></TD>
</TR>

<TR>
<TD align="right">Card Name:</TD>
<TD> <%=rsSubs("chrCardName")%></TD>
</TR>

<TR>
<TD align="right">Card Number:</TD>
<TD> <%=rsSubs("chrCardNumber")%></TD>
</TR>

<TR>
<TD align="right">Expiration Date:</TD>
<TD> <%=rsSubs("chrExpDate")%></TD>
</TR>

<TR>
<TD align="right">Date Entered:</TD>
<TD> <%=rsSubs("dtEntered")%></TD>
</TR>

<TR>
<TD align="right">Subscription Length:</TD>
<TD> <%=rsSubs("intLength")%></TD>
</TR>

<TR>
<TD>&nbsp;</TD>
<TD>&nbsp;</TD>
</TR>

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

Листинг 5.14. SubReport.asp (продолжение)

<%

' Store the last subscription id
idSubscription = rsSubs("idSubscription")

' Move to the next sub
rsSubs.MoveNext

loop

end if

%>

</table>

<BR><BR>

Остается создать ссылку, которая вызывает текущую страницу и передает идентификатор последней выведенной записи. Как говорилось выше, этот идентификатор включается в URL при помощи параметра idSubscription.

Листинг 5.15. SubReport.asp (продолжение)

<!-- Link to this page with the last subscription ID -->
Click <a href="SubReport.asp?idSubscription=<%=idSubscription%>">here</a>
to clear this report.

</BODY>
</HTML>

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

Щелкните на ссылке, чтобы сбросить сведения о новой подписке. Страница загружается повторно с включенным в URL идентификатором последней записи. При этом выполняется фрагмент кода, в котором новые записи помечаются как обработанные. Проверьте поле intProcessed и убедитесь в том, что ему было присвоено значение 1. На экране появляются сведения о новой подписке или сообщение об ее отсутствии.

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

Итоги

В рассмотренном примере были представлены ключевые средства, используемые при создании коммерческих приложений - ASP, SQL Server, HTML и броузер. Если вам понадобится простой способ сбора данных о подписчиках, зарегистрированных пользователях и т. д., такой формы будет более чем достаточно.

При создании подобных форм необходимо учитывать некоторые обстоятельства. Первое - это безопасность. Разумеется, форму необходимо зашифровать с использованием SSL (Secure Sockets Layer), чтобы предотвратить перехват данных в Интернете. Проследите за тем, чтобы имена и пароли для доступа к базе данных нельзя было легко подобрать или угадать. Кроме того, страница управления не должна быть доступной для всех желающих. Организуйте парольную защиту на уровне формы средствами SQL или воспользуйтесь механизмом списка управления доступом (ACL, Access Control List) Windows NT для того каталога, в котором находится страница.

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

Наконец, если вы хотите организовать немедленную обработку данных кредитной карты, рассмотрите возможность использования таких средств, как Cyber-Cash или HP/Veriphone. Если данные успешно проходят проверку, пользователю можно немедленно предоставить доступ к необходимой информации.

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