Система бронирования мест в отелях города

 

Содержание


Перечень сокращений, обозначений, терминов

Введение

1. Анализ задачи создания системы бронирования мест

1.1 Преимущества применения системы управления сайтом

1.2 Основные цели создания и требования, выдвигаемые при разработке системы бронирования мест в отелях города

1.3 Функционал системы управления

1.4 Современные системы управления сайтом

1.4.1 Классификация систем

1.4.2 Список существующих систем

1.4.3 Исследование существующих систем

1.4.4 Вывод о современных системах управления сайтом

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

2.1 Выбор операционной системы

2.2 Выбор системы управления базами данных

2.3 Выбор технологии реализации

2.3.1 О достоинствах и недостатках PHP

2.4 Выбор дополнительного программного обеспечения

2.5 Разработка структуры системы

3. Разработка системы управления сайтом и заявками на бронирование номеров

3.1 Разработка базового функционала системы управления сайтом и заявками на бронирование

3.1.1 Разработка системы доступа к административной части

3.1.1.1 Обеспечение повышенной безопасности

3.1.1.2 Разработка структуры пользовательских сеансов

3.1.2 Разработка структуры представления гостиниц

3.1.2.1 Разработка структуры представления адреса гостиниц

3.1.2.2 Разработка структуры представления телефонов гостиниц

3.1.2.3 Разработка структуры представления номеров гостиниц

3.1.3 Разработка структуры представления заявок

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

3.2.1 Разработка структуры фотогалереи

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

3.2.3 Разработка структуры отдельных страниц сайта

3.2.3 Разработка структуры голосований и опросов

4. Разработка Пользовательского интерфейса системы управления сайтом и заявками на бронирование номеров

4.1 Система управления сайтом

4.1.1 Работа со списками элементов в системе управления сайтом

4.1.2 Работа с отдельными элементами системы управления сайтом

4.2 Система управления заявками на бронирование номеров в отелях

Заключение

Список литературы

Приложение А - Листинг программы


Перечень сокращений, обозначений, терминов


AJAX (Asynchronous JavaScript and XML) - это подход к построению интерактивных пользовательских интерфейсов веб-приложений. При использовании AJAX веб-страница не перезагружается полностью в ответ на каждое действие пользователя. Вместо этого с веб-сервера догружаются только нужные пользователю данные.

API (Application Programming Interface) - программный интерфейс приложения.(Active Server Pages) - альтернативный CGI метод вызова программ на серверной стороне.(Common Gateway Interface) - стандарт интерфейса, служащего для связи внешней программы с веб-сервером. Программу, которая работает по такому интерфейсу совместно с веб-сервером, принято называть шлюзом, хотя многие предпочитают названия скрипт (сценарий) или CGI-программа. Сам интерфейс разработан таким образом, чтобы можно было использовать любой язык программирования, который может работать со стандартными устройствами ввода/вывода.- семейство программных продуктов в области управления информацией компании IBM.модель (entity-relationship model) - модель данных, позволяющая описывать концептуальные схемы. Она предоставляет графическую нотацию, основанную на блоках и соединяющих их линиях, с помощью которых можно описывать объекты и отношения между ними какой-либо другой модели данных.(File Transfer Protocol) - Протокол передачи файлов, предназначенный для обеспечения передачи и приема файлов между серверами и клиентами.

портал бронирование модуль управление

HTML (Hypertext Markup Language) - язык разметки исходного текста веб-документа, включающий специальные символы (теги), которые позволяют веб-браузеру сконструировать из текста дизайн.предоставляет возможности форматирования и обработки форм, управления шрифтами, отображения информации в табличном виде, гипертекстовые связи и поддержку Java-апплетов.(HyperText Transfer Protocol) - методика передачи веб-страниц по сети интернет(Internet Information Services) - это набор серверов для нескольких служб Интернета от компании Майкрософт.АР (Interactive Mail Access Protocol) - протокол интерактивного доступа к электронной почте- СУБД класса Enterprise (Предприятие), подходящая для управления данными в среднем и крупном бизнесе.(Internet Server Application Programming Interface) - интерфейс прикладного программирования интернет-сервера (интерфейс программирования веб-сервера для вспомогательных прикладных систем)EE (Java Platform, Enterprise Edition) - представляет собой первый стандарт для создания корпоративных распределенных многозвенных приложений.(JavaServer Pages) - интерфейс доступа к базам данных или приложениям на языке Java; позволяет формировать динамические страницы на веб-сервере.

JVM (Java Virtual Machine) - виртуальная машина Java. JVM представляет собой операционную "надстройку", которая служит для адаптации существующих компьютерных систем к Java.(Linux + Apache + MySQL + PHP (Perl или Python)) - представляет собой наиболее популярный набор открытых программных средств, используемых для разработки Web-приложений.- свободная система управления базами данных. MySQL характеризуется большой скоростью, устойчивостью и лёгкостью в использовании, является решением для малых и средних приложений. Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты, однако в дистрибутив входит библиотека внутреннего сервера, позволяющая включать MySQL в автономные программы.(Network News Transfer Protocol) - сетевой протокол передачи новостей (используется для распределения новостей по серверам NNTP и клиентам NNTP в интернете; обеспечивает распределение, поиск, извлечение и рассылку новостей; протокол NNTP обеспечивает хранение новостей в центральной базе данных сервера, что позволяет выбирать определенные темы для чтения, обеспечивает индексацию, перекрестные ссылки и уничтожение сообщений после истечения определенного срока)- одна из крупнейших американских компаний, разработчик систем управления базами данных, инструментов для разработки баз данных, а также ERP-систем. Самым известным продуктом Oracle Inc. является одноимённая СУБД.(Portable Document Format) - платформонезависимый формат электронных документов, созданный фирмой Adobe Systems с использованием ряда возможностей PostScript. В первую очередь предназначен для представления в электронном виде полиграфической продукции

PERL (Practical Extraction and Report Language) - язык программирования для разработки CGI-скриптов. Программы, написанные на Perl, запускаются на стороне сервера(ранее расшифровывалось как personal home page, а сейчас Hypertext Preprocessor) - система разработки сценариев, включающая:

·CGI-интерфейс;

·интерпретатор языка;

·набор функций для доступа к базам данных и различным объектам WWW.

PostgreSQL - свободная объектно-реляционная система управления базами данных (СУБД).

Является свободной альтернативой коммерческим СУБД (таким как Oracle Database, Microsoft SQL Server, IBM DB2 и СУБД производства Sybase) вместе с другими свободными СУБД (таким как MySQL и Firebird).- компьютер или программная система, предоставляющая удаленный доступ к своим службам или ресурсам с целью обмена информацией.timeout - Время истечения сессии.DB - одна из популярных баз данных.(Visual Basic Scripting) - язык сценариев, разработанный на основе языка Visual Basic- глобальное информационное пространство, основанное на физической инфраструктуре Интернета и протоколе передачи данных HTTP.(eXtensible Markup Language) - Стандарт на представление данных, ориентированный, в частности, на обмен информацией между независимыми участниками. В отличие от HTML, предназначен для представления информации в рафинированном виде, более пригодном для потребления программами, а не восприятия человеком. Формат XML предполагает структурную, а не оформительскую разметку информации.

БД (База Данных) - совокупность связанных данных, организованных по определенным правилам, предусматривающим общие принципы описания, хранения и манипулирования, независимая от прикладных программ. База данных является информационной моделью предметной области. Обращение к базам данных осуществляется с помощью системы управления базами данных (СУБД).

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

Редизайн - создание нового шаблона дизайна сайта вместо имеющегося

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

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

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

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

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

МЕТА-теги - теги, расположенные в шапке документа.

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

Введение


Одной из наиболее развивающихся в российской экономике является сфера услуг, в частности туризм и непосредственно гостиничный бизнес. Так, рентабельность малого гостиничного бизнеса может колебаться в пределах 15-80%. Причем туристическая привлекательность ряда городов, например, Санкт-Петербурга - не единственная причина. Сегодня совершается гораздо больше деловых поездок, чем 10-20 лет назад. В связи с этим в Санкт-Петербурге и других городах появилось огромное количество мини-отелей, маленьких гостиниц по 3-7 номеров. И человеку, может оказаться, совсем не просто выбрать наиболее подходящую именно ему и забронировать номер.

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

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

Но развитие Интернета сказалось не только на клиенте гостиничной сферы, но и на поставщике соответствующих услуг. На сегодняшней день мало фирм, которые бы не имели своего представительства во всемирной паутине. Более того, большинство из них имеют по несколько сайтов-порталов, а некоторые, вдобавок, создали десятки сайтов посвященных отдельным гостиницам. Стоит отметить, что очень многие мини-отели заводят собственную страничку в Интернете. Информация стала более доступной как для людей, желающих остановится в одной из них, так и для посредников. Теперь посетитель гостиничного портала какой-либо из фирм по бронированию может найти информацию практически о любой гостинице или мини-отеле. Естественно, это огромные объемы информации, требующие постоянного обновления. Как правило, для этих целей используются различные системы управления содержимым (cms - content manager system).

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

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

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

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

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

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

1. Анализ задачи создания системы бронирования мест


1.1 Преимущества применения системы управления сайтом


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

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

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

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

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

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

·работа с текстом (внесение/изменение текста, его шрифта, начертания, цвета и т.п.);

·работа с таблицами;

·установка ссылок;

·работа с изображениями и другими файлами;

·установка дополнительных сервисов (гостевые книги, форумы и т.п.).

Из бесспорных преимуществ CMS можно перечислить следующие:

·редактору нет необходимости знать Web-технологии и языки программирования:

·достаточно лишь навыков работы в Microsoft Word;

·возможность внесения изменений на сайте в любое время суток из любой точки мира, где есть доступ к Интернету;

·нет необходимости вводить в курс дела другого человека, можно сделать все так, как хочется заказчику;

·снижение стоимости содержания сайта;

·как правило, CMS не зависит от дизайна: содержимое страниц хранится в базе данных.

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


1.2 Основные цели создания и требования, выдвигаемые при разработке системы бронирования мест в отелях города


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

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

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

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

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

Возможность изменения дизайна должна быть реализована путем отделения части содержания от оформления.html-файлы или tpl-файлы шаблонов должны быть вынесены в отдельную папку на сервере.

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

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


1.3 Функционал системы управления


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

Понятие Content management (управление информацией, содержанием) на сегодняшний день включает в себя широкий спектр программного обеспечения, начиная с набора коротких скриптов, позволяющих добавлять новости или пресс-релизы на одной странице сайта, кончая полноценными системами паблишинга, поддерживающих процессы workflow (цепочки Автор-Корректор-Редактор), обеспечивающих различные схемы разграничения доступа, автоматически создающих "связанные" документы и т.п.

Функциональность системы базируется на основных возможностях главного модуля ("ядра" системы).

) Добавление/изменение информации - основное предназначение системы управления контентом.

) Изменение структуры сайта - добавление или изменение расположения, информационной нагрузки или формы сайта

) Изменение дизайна сайта - предоставление возможности доработки или полной переработки всего дизайна или отдельных его частей

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


1.4 Современные системы управления сайтом


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

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

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

Особо следует отметить высокий уровень технической поддержки, предоставляемый многими российскими разработчиками клиентам, находящимся в России. Тонкая настройка системы под конкретные нужды предприятия, любые консультации и решение возникающих проблем - такой сервис сложно получить, если покупать систему управления контентом у иностранцев или пытаться воспользоваться open-source-продуктами [2].


1.4.1 Классификация систем

Существует несколько моделей, по которым строятся системы управления.

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

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

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

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

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

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

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

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

Порталы. Используются для информационных ресурсов, основной целью ставят максимальное упрощение публикации статей и новостей. Могут включать в себя нижеперечисленные типы CMS как самостоятельные модули. Наиболее известные представители данного класса: AngelineCMS, Bes-cms, CoolPHP, CPGNuke, Be6ZE, Xaraya, xNuke, XOOPS и др.

"Движки" без SQL. Это ответвление в разработке CMS развито относительно слабо, так как использование в качестве хранилища информации файлов вместо таблиц базы данных сопряжено с множеством труднорешаемых проблем (таких, как одновременная запись в один файл несколькими копиями скрипта) 2. Достоинство этих CMS - в доступности для модификации контента и возможности размещения на бесплатных хостингах. Есть несколько реализаций данной идеи: Cute News, DeeLight CMS, Progressive, SAPID.

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

Форумы. Это инструмент для общения на сайте. Сообщения в форуме в чем-то похожи на почтовые - каждое из них имеет автора, тему и содержание. Но для того, чтобы отправить сообщение в форум, не нужна никакая дополнительная программа - нужно просто заполнить соответствующую форму на сайте. Принципиальное свойство форума заключается в том, что сообщения в нем объединены в треды (от англ, thread - "нить"). Когда вы отвечаете в форуме на чье-то сообщение, ваш ответ будет "привязан" к исходному сообщению. К форумам, достойным внимания, можно причислить FUDforum, openBB, Phorum, phpBB, PunBB, W-gora, XMB, Zorum, ExBB, IPB, vBulletin.

Магазины. К магазинам отнесем любой сайт, с которого можно заказать какой-либо товар. В данном случае в определение "товара" может входить абсолютно все, включая время доступа в Интернет, минуты сотовой связи. Абсолютное большинство Интернет-магазинов являются нелегальными. CMS, позволяющие создать виртуальный магазин: MyMarket, osc2nuke, osCommerce, Zen Cart.

Групповая работа (Groupware) - комплекс программного обеспечения, позволяющий организовать работу предприятия, отношения с клиентами и заказчиками в Интернете. Обычно представляет собой полностью или частично закрытую часть сайта с возможностью отслеживать сроки выполнения поставленных задач, распределение ролей и временных нормативов. Иногда можно выносить вопросы на обсуждения и решения вышестоящего руководства. Как правило, пользуются следующими CMS: dotProject, eGroupWare, MoreGroupware, phpCollab, PHProjekt.

Обучение (e-Learning) - дистанционная форма обучения с использованием Интернета. Онлайновая форма обучения уже не один год является "маяком", на который ориентируются образовательные системы разных стран мира. Главным стратегическим направлением является быстрое обновление знаний и эффективное использование информации. Таких систем немного: ATutor, Caroline, LogiCampus, Moodle, Segue.

Биллинг (Billing). Программное обеспечение, позволяющее провайдерам и реселлерам работать со счетами клиентов. Такие CMS являются неотъемлемой частью крупной системы учета потребления услуг пользователями. Задача же CMS данной категории - в отображении информации о предоставленных услугах, подключении новых услуг, изменении текущих параметров, приеме платежей и т.п. Часто такие системы пишутся своими силами. Для примера можно привести биллинг-панель RuWEB. В ней создано огромное количество тарифных планов, позволяющих платить только за те параметры хостинга (трафик, место на жестком диске, MySQL, PHP, Perl), которые используются в полном объеме.

Администраторская панель хостинга. К этому классу относятся такие продукты, как Direct Admin и Control Panel. Немало хостинг-провайдеров стараются написать панель управления для пользователя хостинга своими силами, однако ни одно подобное решение, насколько мне известно, так и не смогло по возможностям и эргономике хоть немного приблизится к вышеупомянутым системам [3].


1.4.2 Список существующих систем


Бесплатные системы управления сайтом

UMI. CMS Free

CuteNews <#"center">1.4.3 Исследование существующих систем

Bitrix (компания "Битрикс")

На данный момент Bitrix - наиболее функциональная CMS на российской рынке. Система относится к среднему классу. У Bitrix одни из самых высоких показатели продаж - более 130 лицензий за 2003 год, а отчуждаемости системы - около 50%. Кроме цен на лицензии имеются затраты на внедрение, которые составляют до 15% от стоимости лицензии.

Наиболее известные компании, использующие Bitrix - Elcomsoft, Ritlabs.

Текущая версия системы - Bitrix 6.0. Из стандартных комплектаций решения на рынке присутствуют: "Старт", "Эксперт", "Бизнес", "Стандарт". Полнофункциональные версии имеют модификации под различные СУБД - MySQL и Oracle.

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

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

Optimizer (компания "Гарант-Парк-Интернет")

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

Относительно невысокая функциональность компенсируется высокой юзабилити и практически полным отсутствием требований к пользователю. Возможность разработки и настройки сайта реализуется путем отделения back office от front office в отдельную часть - "Конфигуратор", который могут использовать непосредственно разработчики.

Из наиболее известных компаний, использующих технологию Optimizer - Ericsson, "Мир аэрофлота", "Совинтел".

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

Недостатки системы - техническое требование платформы Windows 2000 Server + MS SQL, однако в ближайшее время планируется разработка Unix-версии. Еще один минус данного решения - отсутствие внутренней системы сбора статистики.

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

RBC Contents (компания RBC Soft)

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

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

Из наиболее известных компаний, использующих RBC Contents, - RBC, "МТУ-Информ", ГУМ, РОСНО, Philips, "Лукойл".

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

Saitistika (компания Individ)

Satistika - одна из самых функциональных CMS в Рунете. Общий уровень системы можно оценить как высокий, что характеризуется и относительно высокой ценой дистрибутива - $2000. Решение хорошо отчуждаемо, около 50% внедрений производится покупателями. Относительно небольшое количество внедрений системы можно объяснить достаточно высокой стоимостью, техническими ограничениями, а также требованиям, предъявляемыми к разработчикам.

Наиболее известные компании, использующих систему - Xerox, "Компьютера", МДМ-банк.

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

К недостаткам системы относятся перегруженность административного интерфейса, технические требования (ОС Windows, MS SQL), отсутствие модульной структуры.

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

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

Dynasite (компания Reksoft)

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

Непосредственно функции по управлению контентом реализованы слабо. Неудобный в работе интерфейс, отсутствие внятной навигации, нехватка даже стандартных возможностей. Нет смысла критиковать Dynasite с позиций CMS-систем среднего класса - по "внешним" признакам он заведомо проиграет. Однако заложенные в систему возможности могут оказать существенное влияние на становление рынка тяжелых систем. Недаром почти 90% конкурентов назвали DynaSite одной из самых мощных CMS.

Среди компаний, использующих DynaSite - "МегаФон", фондовая биржа РТС, магазин "Озон". Большинство сайтов, построенных на базе DynaSite, имеют сложную программную часть, что опять же характеризует систему как среду для разработок, нежели внешнюю CMS.

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

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

Q-Publishing (компания Quantum Art)

Q-Publishing - одна из наиболее популярных CMS в Рунете. С помощью грамотного позиционирования ее разработчикам удалось добиться хорошего уровня цитируемости и узнаваемости своего брэнда. Общий уровень системы можно оценить как средний. Из ее 0особенностей стоит отметить значительный уровень внедрений на зарубежных сайтах (90 из 120 за 2003 год). Причина тому - реализация партнерских программ с софтверными компаниями, занимающимися распространением системы среди зарубежных потребителей. Также это сказывается и на ценовой политике компании - стоимость лицензии более $1000.

Среди самых крупных российских компаний, пользующихся Q-Publishing, - ЮКОС и ABBYY. Среди самых крупных иностранных компаний AOL, SUN Microsystems, Canon.

Отчуждаемость системы можно оценить как невысокую (примерно 80% внедрений являются внутренними). Однако по этому показателю данное решение превосходит некоторые коробочные продукты.

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

Из уникальных наработок системы следует выделить Mаsquerade Filter - механизм, дающий возможность преобразовывать URL динамических страниц в приемлемый для поисковых роботов вид; морфологический поиск (разработан совместно с ABBYY), который позволяет производить поиск с учетом смысловой нагрузки.

Субъективная оценка. Система Q-Publishing производит впечатление хорошо сделанной профессиональной платформы. Неплохо проработаны возможности параллельного развития - API, интеграция с 1C. Использование системы по преимуществу на зарубежных сайтах также говорит в ее пользу - западный рынок CMS более устойчив, чем российский. Решение имеет удобный интерфейс и средний уровень юзабилити.

NetCat (компания АИСТ)

NetCat относится к классу легких систем. Показатель отчуждаемости и переносимости системы наиболее высок среди всех аналогичных CMS. Кроме того, NetCat - наиболее "коробочный" продукт. Только 15% внедрений являются внутренними, 40% делаются партнерами, а больше всего, 45% - самими покупателями.

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

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

Среди компаний, использующих NetCat - "Сотовик", "Новатэк", "Росбанк", "Сыктывкарский фанерный завод".

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

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

Субъективная оценка. Благодаря высокому юзабилити и качественно реализованному функционалу NetCat удобна для пользователей, не обладающих специальными знаниями. Легкость в установке и обновлении системы, модульная структура делают эксплуатацию продукта максимально комфортной для разработчиков сайта.имеет высокий темп развития и очень хорошие перспективы на то, чтобы в дальнейшем стать главным игроком на рынке легких и, возможно, средних CMS-систем [5].


1.4.4 Вывод о современных системах управления сайтом

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

) Система должна быть максимально проста в использовании.

) Для обеспечения массовости система должна быть кроссплатформенной.

) Разработка системы должна быть дешевой.

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

) Система должна быть расширяемой.

) Система должна свести к минимуму загрузку каналов передачи данных.

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


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

Все необходимое программное обеспечение можно разбить на несколько составляющих:

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

СУБД. С учетом всех требований, предъявляемых и CMS, необходимо выбрать СУБД, которая бы позволила реализовать все функции, предусмотренные в CMS.

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

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

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

2.1 Выбор операционной системы


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

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

Если говорить о серверной составляющей, то тут положительным для приложения будет являться, если оно будет кроссплатформенным. Тем не менее, следует определить, на какую ОС установка будет оптимальной. Система Windows не очень хороша в качестве сервера услуг Интернет. На момент написания работы самым распространенным сервером для хранения Web-узлов на платформе Windows является IIS (Internet Information Service). Его последние версии существенно усовершенствованы, но он по-прежнему страдает от множества изъянов в области безопасности, а системные администраторы считают его ненадежным и неустойчивым. Кроме того, Windows - это слишком ресурсоемкая среда для обслуживания Internet. Из 2 Гбайт памяти 512 Мбайт может отводиться для работы операционной системы с ее различными службами и лишь 64 Мбайта могут реально использоваться для работы Web-сервера. Операционная система Unix является более экономичной и надежной. Ее не так просто настроить, но она работает несравнимо быстрее и устойчивее, требуя при этом гораздо меньше ресурсов. Итак, поскольку ОС Unix превосходит Windows и по скорости и по надежности, то окончательный выбор именно за ней. Конкретно выберем операционную систему ASPLinux 9.0. Данная ОС из семейства UNIX, является бесплатной, свободно распространяемой, имеет достаточно высокий уровень надежности, защищенности, хорошо поддерживается в нашей стране. Также в поставке с ней идет большое количество приложений обеспечивающих полноценную работу данной ОС в качестве Web-сервера, сервера баз данных, файлового сервера и т.п.


2.2 Выбор системы управления базами данных


Сервер базы данных может быть физически установлен на другой машине, и выбор таких серверов достаточно широк. Среди возможных вариантов: PostgreSQL, MySQL, Oracle, Informix, DB2, Microsoft SQL Server, SUP DB и многие другие. Все эти варианты достаточно хороши. Поскольку серверы баз данных не имеют выхода в Интернет, вопросы безопасности при их выборе не играют ключевой роли. Если брандмауэр настроен правильно, то все серверы баз данных являются одинаково безопасными. Все эти серверы являются достаточно надежными и быстрыми. Реальные различия в производительности зачастую определяются структурой базы данных, а не особенностями самого сервера.

Во-первых, этот сервер является, наверное, самым широко распространенным после MySQL.

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

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

Перед тем как приступить к окончательному выбору СУБД, необходимо выделить набор факторов, которые необходимо учитывать.

Приведем перечень наиболее часто используемых факторов оценки СУБД:

·требуемые объемы основной и дисковой памяти;

·трудоемкость разработки программных средств окружения СУБД;

·трудоемкость реализации приложений;

·затраты на обучение персонала;

·стоимость эксплуатации, информационной системы;

·возможность совмещения разработки БД с ранее выполненными программными реализациями;

·прогнозируемые сроки реализации информационной системы.

На основе анализа проведенного в предыдущем разделе, а также, учитывая вышеперечисленные факторы, наиболее подходящими в качестве сервера баз данных являются СУБД PostgreSQL и Mysql, так как они обладает высокой надежностью, защищенностью, хорошей производительностью, а также открытостью. Кроме того, они являются одними из наиболее распространенных.

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

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

2.3 Выбор технологии реализации


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

) Запрос. Клиент, с помощью web-броузера инициирует запрос к серверу по протоколу HTTP.

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

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

) Формирование результата. После того, как запрос обработан, информация, подготовленная для пользователя, форматируется для протокола HTTP.

) Передача данных клиенту. После формирования, данные передаются клиенту в качестве ответа. Ответ содержит данные (обычно HTML код, либо двоичные данные), а также дополнительные параметры, передаваемые в заголовках HTTP ответа.

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

ISAPI - Internet Server Application Programming Interface. Интерфейс ISAPI используются для непосредственного управления поведением Web-сервера. Так, ISAPI позволяет осуществлять доступ к функциям и службам Web-сервера Internet Information Server (IIS) фирмы Microsoft. В каждом отдельном случае применения интерфейса пишется программный код, который вызывается Web-сервером как выходная пользовательская процедура (user exit routine) или "закладка" (user hook). Процедуры вызываются в некоторых заданных (опубликованных) точках программного кода Web-сервера и записываются не в виде отдельных программ, а в виде набора библиотечных функций, действующих в качестве расширения Web-сервера.(англ. Active Server Pages - "активные серверные страницы") - технология от Microsoft, позволяющая легко разрабатывать приложения для World Wide Web. ASP работает на платформе операционных систем линии Windows NT и на веб-сервере IIS. ASP не является языком программирования - это лишь технология предварительной обработки, позволяющая подключать программные модули во время процесса формирования Web-страницы. Относительная популярность ASP основана на простоте используемых языков сценариев (VBScript или JScript) и возможности использования внешних COM-компонент.

ASP.net является составной частью платформы Microsoft.net и развитием более старой технологии Microsoft ASP. На данный момент последней версией этой технологии является ASP.net 2.0. Эта версия имеет серьезные отличия от своей предшественницы. Microsoft полностью перестроила ASP.net, основываясь на Common Language Runtime (CLR), который является основой всех приложений Microsoft.net. Программисты могут писать код для ASP.net, используя различные языки программирования, поддерживаемые в.net Framework, обычно (коммерческие) Visual Basic.net, JScript.net или C#, а также "открытые" языки, например, Perl и Python.

Сервлет - программа, которая расширяет функциональные возможности web-сервера, динамически генерируя содержание и взаимодействуя с web-клиентами при помощи принципа запрос-ответ. Web-клиентами могут быть не обязательно браузеры, это могут быть любые программы, использующие протокол HTTP.(JavaServer Pages) - технология, позволяющая веб-разработчикам динамически генерировать HTML, XML и другие веб-страницы. Является составной частью единой технологии создания бизнес-приложений J2EE. Технология позволяет внедрять Java-код, а также EL (expression language) в статичное содержимое страницы. Также могут использоваться библиотеки JSP тегов для внедрения их в JSP-cтраницы. Страницы компилируются JSP-компилятором в сервлеты, представляющие собой Java-классы, которые выполняются на сервере. Весь код страницы транслируется в java-код сервлета с помощью компилятора JSP страниц Jasper, и затем компилируется в байт-код виртуальной машины java (JVM). Сервлет-контейнеры (Tomcat), способные исполнять JSP страницы, написаны на платформонезависимом языке Java, который может работать под различными операционными системами и платформами. Сервлет-контейнеры могут работать как полноценные самостоятельные web-серверы, работать поставщиком страниц для другого web-сервера или интегрироваться в J2EE сервер приложений. Web-контейнер обеспечивает обмен данными между сервлетом и клиентами, берет на себя выполнение таких функций, как создание программной среды для функционирующего сервлета, идентификацию и авторизацию клиентов, организацию сессии для каждого из них.(Перл). Само слово Perl - аббревиатура, которая расшифровывается как Practical Extraction and Report Language (практический язык извлечений и отчётов, отчего сначала язык назывался PEARL, но затем буква "A" "потерялась"). Основной особенностью языка считаются его богатые возможности для работы с текстом, реализованные при помощи регулярных выражений.(англ. PHP: Hypertext Preprocessor - "PHP: Препроцессор Гипертекста") - скриптовый язык программирования, созданный для генерации HTML-страниц на веб-сервере и работы с базами данных. В настоящее время поддерживается подавляющим большинством представителей хостинга. Входит в LAMP - "стандартный" набор для создания вебсайтов (Linux, Apache, MySQL, PHP (Python или Perl)). PHP отличается наличием ядра и подключаемых модулей, "расширений": для работы с базами данных, сокетами, динамической графикой, криптографическими библиотеками, документами формата PDF и т.п. Любой желающий может разработать своё собственное расширение и подключить его. Существуют сотни расширений, однако в стандартную поставку входит лишь несколько десятков хорошо зарекомендовавших себя. Интерпретатор PHP подключается к веб-серверу либо через модуль, созданный специально для этого сервера (например, для Apache или IIS), либо в качестве CGI-приложения. Кроме этого, он может использоваться для решения административных задач в операционных системах UNIX, Linux, Windows и др. Однако в таком качестве он не получил распространение.(от англ.common Gateway Interface - "общий интерфейс шлюза") - стандарт интерфейса, служащего для связи внешней программы с веб-сервером. Программу, которая работает по такому интерфейсу совместно с веб-сервером, принято называть шлюзом, хотя многие предпочитают названия скрипт (сценарий) или CGI-программа. Сам интерфейс разработан таким образом, чтобы можно было использовать любой язык программирования, который может работать со стандартными устройствами ввода/вывода. Такими возможностями обладают даже скрипты для встроенных командных интерпретаторов операционных систем, поэтому в тех случаях, когда нет нужды в сложной функциональности, могут использоваться даже такие простые командные скрипты. Отличается от остальных рассматриваемых технологий тем, что является наиболее низкоуровневой и является стандартом интерфейса, который служит для связи внешней программы с web-сервером.

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

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

Для дальнейшего выбора технологии воспользуемся исследованиями, предоставленными в открытый доступ [6].

В тестировании принимали участие:

·Tomcat (internal web server);

·mod_php 4.0b2;

·mod_perl 1.21;

·JRun 2.3.3/Apache 1.3.9;

·ServletExec 2.2/Apache 1.3.9;

·CGI using Perl.

Для реализации тестов использовалось следующее аппаратное и программное обеспечение:

·сервер - 300 Mhz Pentium II, RedHat 6.0/64 Мб оперативной памяти;

·клиент - 300 Mhz Celeron, RedHat 6.0/32 Мб оперативной памяти.

Используемые тесты:. В данном тесте производилось чтение и передача небольшого (311 байт) статичного файла - т.е. тестирования СТ в качестве обычного web-сервера.. Для измерения "накладных расходов" работы СТ использовалась тестовая программа "Hello, World". Другими словами, как бы эффективно ни была написана ваша серверная программа, вы никогда не получите более высокие показатели производительности, нежели в этом тесте.. Тест, практически во всем аналогичный тесту Servlet, с тем отличием, что применялся для тестирования PHP, Perl`a и ASP, тогда как Servlet относился лишь к Java СТ.. Тест выводящий "Hello, World" в цикле суммарным объемом около 64 кб. Этот тест, особенно в сравнении с тестом Big дает довольно грубое представление о производительности базовых функций.. В данном тесте производилась отправка сравнительно большого (около 64 кб) массива статичной информации.. Простейший запрос к базе данных (два запроса Select). Дает оценочное представление о производительности цепочки web-сервер - СТ - сервер базы данных (точнее драйвер базы данных - сервер базы данных, даже если драйвер встроенный). Для JAVA тестов во второй части, первое число в таблице означает результаты тестирования с использованием драйвера org. gjt.. Второе число - результат тестирования с применением драйвера Caucho. В общем случае данный метод двойного тестирования демонстрирует важность драйвера базы данных для быстродействия системы в целом.. Тот же тест что и DB, но в заголовке страницы указывался "срок давности" (Expires) плюс 15 секунд от времени исполнения.

Таблица 2.1 - производительность (операций в секунду). Более высокие показатели означают большую производительность. Тест для одного пользователя.

ТехнологияFileServletHelloBigDBCacheMod_PHP/Apache56129152117117Mod_Perl/Apache55036592111111ServletExec/Apache/IBM536981035959Tomcat/IBM12910094205050CGI Perl/Apache550672877JRun/Apache/JDK1.253169372525Tomcat/JDK 1.2376237122424

Как видно из таблицы PHP и Perl в разы опережают своих конкурентов по всем тестам, кроме "File". Поэтому мы убираем из дальнейшего рассмотрения такие технологии как сервлеты, JSP и CGI. Следует отметить, что из рассмотрения были вычеркнуты технологии на базе Resin web Server, которая является значительно более скоростной, в силу наличия ряда уязвимостей. Так, злоумышленник, согласно журналу "Хакер", после некоторых манипуляций может просмотреть JSP исходный код и получить доступ к ограниченным директориям.

Далее была проведена еще одна серия тестов. Суть их осталась прежней. Единственное существенное отличие состояло в том, что была эмулирована одновременная работа нескольких пользователей - 4 клиента и один сервер. Число четыре было выбрано неслучайно. Учитывая малое время выполнения одного теста, одновременное выполнение четырех запросов представляется, по мнению автора, вполне достаточным и отражает загрузку среднепосещаемого по российским меркам, сервера. (Предположительно около 20000 запросов в течение суток, 50% которых приходится на обед) - получаем пиковую загрузку порядка 10000 запросов в час, или 2,8 запроса в секунду. Также в тестирование была добавлена технология ASP.

Таблица 2.2 - производительность (операций в секунду). Более высокие показатели означают большую производительность. Тест для четырех пользователей.

ТехнологияFileHelloLoopBigDBMod_Perl/Apache801385119793ASP/IIS16543851.480-Mod_PHP/Apache8693421344141

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

Теперь сделаем последний выбор: ASP - PHP. В пользу ASP говорит ее большая производительность, но на данный момент, ASP в полном объеме существует только для платформы Windows. Разработки по переносу на другие системы ведутся, но еще не завершены и их будущие результаты трудно оценить. Что касается разработки сайтов, то ASP сильно привязана к серверу IIS, и, хотя архитектура позволяет перенести приложения ASP на другую платформу, на данный момент реальная возможность отсутствует. Таким образом важнейшее - многоплатформенность пока еще не может быть удовлетворено платформой ASP.net, а значит ее использование для такой системы пока не оправдано. Однако необходимо отметить, что такая система должна иметь возможности интеграции с платформой.net (особенно Web - сервисы), поскольку ее будущее широкое использование не вызывает сомнений.

Итак, окончательный выбор сделан в пользу PHP.

2.3.1 О достоинствах и недостатках PHP

Достоинства:

·является си-подобным языком, поэтому многим программистам будет легко перейти на него;

·бесплатен;

·в связке с MySQL является кроссплатформенной технологией;

·постоянно совершенствуется;

·допускает работу с большинством СУБД;

·объектно ориентирован;

·поддерживает все популярные протоколы (HTTP, FTP, IMАР, NNTP, POPS, net sockets и другие);

·наиболее популярен в мире и в России в частности.

PHP используется такими компаниями как "Zend", "MySQL", "Бегун", "РДВ-Медия", "Хронопей", "RU-CENTER", "АВТОВАЗ", "Microsoft", а также разработчиками "Мамбы", "МойКруг", "RedTram", "РБК" и многими другими. И, главное, именно на php написаны самые дорогие и сильные, по мнению большинства web разработчиков, системы управления контентом UMI. CMS и Bitrix.

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

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

2.4 Выбор дополнительного программного обеспечения


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

После выбора платформы мы оказываемся перед не столь широким ассортиментом Web-серверов. Для Unix остается несколько возможных вариантов: Apache, Zeus, AOL Server и Pi3Web.

С учетом того, что ранее мы уже остановили свой выбор на PHP, установленном как интегральная часть Web-сервера (SAPI), практически безальтернативным выбором является сервер Apache. Он используется на 70% Web-серверов во всем мире, и показал себя очень надежным и быстрым вариантом. Более того, мы существенно упростим себе жизнь при выборе провайдера, т.к. этот Web-сервер установлен практически у каждого отечественного провайдера.

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

Сервер Apache во многом обязан своим появлением компании Netscape. В 1994 года в Netscape перешел Роб Мак-Кул (Rob McCool), который до этого работал в NCSA (National Center for Supercomputing Applications - Национальный центр суперкомпьютерных приложений) и создал Web-сервер NCSA. После его ухода из NCSA процесс разработки сервера приостановился, поэтому Web-мастера стали сами дорабатывать сервер и устранять ошибки. Несколько таких разработчиков объединили свои усилия и начали распространять свои наработки по всему миру (отсюда и название: "apatchy'' означает "защита").

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

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


2.5 Разработка структуры системы


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

Во-первых, системное программное обеспечение. Данный компонент представляет программное обеспечение, как на стороне клиента, так и на стороне сервера. К системному программному обеспечению относятся операционные системы, под управлением которых будет функционировать разрабатываемая CMS. В соответствии с разделом 2.1, в котором производился выбор операционных систем, были выбраны две операционный системы: Windows XP (ОС для рабочих станций), ASPLinux 9 (ОС для серверов).

Во-вторых, система управления базами данных Mysql. Данный компонент представляет программное обеспечение на стороне сервера. В соответствии с выводами, сделанными в разделе 2.2, данный продукт был выбран в качестве СУБД для проектируемой системы. Собственно, сама проектируемая база данных будет являться подкомпонентом СУБД MySQL.

В-третьих, web-интерфейс. Данный компонент представляет программное обеспечение, как на стороне клиента, так и на стороне сервера. Данный компонент необходим, так как нами было принято решение о создании Web-интерфейса для доступа к СУБД. Данный компонент включает в себя следующие составляющие:

) Web-браузер. Программное обеспечение, находящееся на стороне клиента, и обеспечивающее доступ к СУБД посредством Web-интерфейса;

2)Web-сервер Apache. Дополнительное программное обеспечение, находящееся на стороне сервера. Web-сервер обеспечивает механизм связи удаленного клиента и СУБД, посредством протокола HTTP.

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


Рис.2.1 - Архитектура системы управления сайтом


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

Выделим основные составляющие серверной и клиентской частей системы, определим их назначение и взаимосвязь.

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

Сервер баз данных должен включать в себя СУБД (в нашем случае это MySQL), и соответственно, базу данных, содержащую информацию.

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

При подключении пользователя к СУБД посредством web-интерфейса используется обычное TCP/IP соединение. Поэтому сервер тоже должен быть настроен соответствующим образом.

Для поддержки работы Web-интерфейса, также необходимо использование Web-сервера.

Основными составляющими Web-сервера являются:

·cобственно Web-сервер (в нашем случае это Apache);

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

·библиотеки PHP, которые, помимо всего прочего, должны включать набор функций, обеспечивающих доступ к серверу СУБД;

·PHP-скрипты - реализуют интерфейс пользователя.

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

Рассмотрим теперь структуру программного обеспечения со стороны клиента. Клиенты могут работать посредством Web-интерфейса. Со стороны клиентов находится только Web-браузер. Им может быть Internet Explorer, Opera, Mozilla и т.п.

Рассмотрим основные механизмы взаимодействия описанных компонентов информационной системы.

Удаленный пользователь, работающий посредством Web-интерфейса, взаимодействует с Web-сервером через протокол HTTP.

При этом запрос к базе данных передается Web-серверу, тот в свою очередь, принимает его и обрабатывает в соответствии с кодом, написанным в PHP-скриптах, и соответственно генерирует SQL запрос к серверу СУБД.сервер взаимодействует с сервером СУБД через протоколу TCP/IP.

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

3. Разработка системы управления сайтом и заявками на бронирование номеров


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

·Основной функционал, затребованный заказчиком в самом начале;

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

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


3.1 Разработка базового функционала системы управления сайтом и заявками на бронирование


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


3.1.1 Разработка системы доступа к административной части

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

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

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

Основным элементом сеанса является его идентификатор (session identifier), который однозначно определяет сеанс. Сгенерированный и отправленный клиенту при первом запросе идентификатор сеанса должен быть уникальным и в то же время достаточно защищенным, чтобы злоумышленник не мог легко его подделать.

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


3.1.1.1 Обеспечение повышенной безопасности

С учетом требований заказчика о повышенном внимании к безопасности применяются следующие дополнительные средства защиты:

а) Использование временных интервалов истечения срока:

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

б) Задание максимального срока жизни сессии:

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

в) Проверка пользовательского агента:

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


3.1.1.2 Разработка структуры пользовательских сеансов

ER-диаграмма устройства пользовательской сессии представлена на рисунке 3.1.


Рисунок 3.1 - ER-диаграмма пользовательской сессии


Основу структуры составляет таблица user_session (таблица 3.1). Она описывает непосредственно саму сессию, в том числе 32-символьный идентификатор, и именно через нее осуществляется доступ ко всей информации, связанной с сессией.


Таблица 3.1 - Описание таблицы user_session базы данных

НазваниеТип данныхОписаниеid_sessionintИдентификатор сессии. Первичный ключid_userintИдентификатор пользователя. Указывает непосредственно на зарегистрированного пользователя, к которому относится сессияascii_session_idvarchar (32) 32-символьный идентификатор сессииlogged_inboolФлаг, говорящий о том, авторизовался ли пользователь под этой сессиейlast_impressiondatetimeВремя и дата последнего запроса к странице в течение сеансаcreateddatetimeВремя создания сессииuser_agentvarchar (255) Содержит информацию о пользовательском агенте (броузер и пр.)

Зачастую может понадобиться хранение дополнительных данных в рамках некоторой сессии, например, о посещенных ранее страницах. Для описания и хранения любых подобных переменных используется таблица session_variable (таблица 3.2).


Таблица 3.2 - Описание таблицы session_variable базы данных

НазваниеТип данныхОписаниеid_sessionintИдентификатор сессии. Указывает на сессию, к которой относится переменнаяid_variableintИдентификатор переменной. Первичный ключvariable_namevarchar (70) Имя переменнойvariable_valuetextЗначение переменной

Регистрационная информация хранится в таблице user (таблица 3.3). Для обеспечения большей безопасности пароль хранится в базе данных в зашифрованном состоянии (используемый метод шифрования - md5), на тот случай, если злоумышленник получит доступ к этим данным.


Таблица 3.3 - Описание таблицы user базы данных

Названиетип данныхОписаниеid_userintИдентификатор пользователя. Первичный ключ. usernamevarchar (32) Имя пользователя (логин). md5_pwvarchar (32) Пароль

Структура также предусматривает последующее расширение функциональности системы, а именно введение различных уровней доступа. Для этого дополнительно спроектированы таблицы access (таблица 3.4) и таблица to_access (таблица 3.5). Они описывают разделы, к которым можно настроить права доступа и определяют непосредственно сам уровень.

Таблица 3.4 - Описание таблицы to_access базы данных

Названиетип данныхОписаниеid_userintИдентификатор пользователя. Указывает на пользователя, к которому относятся праваto_accessintИдентификатор раздела, к которому осуществляется доступ. Указывает на раздел, к которому относятся права. access_levelintУровень доступа

Таблица 3.5 - Описание таблицы user базы данных

Названиетип данныхОписаниеto_accessintИдентификатор раздела, которому можно настроить права доступа. Первичный ключnamevarchar (20) Имя раздела.

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


3.1.2 Разработка структуры представления гостиниц

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


Рисунок 3.2 - ER-диаграмма гостиницы


Центральным элементом в структуре гостиниц является таблица hotel (таблица 3.6).


Таблица 3.6 - Описание таблицы hotel базы данных

Названиетип данныхОписаниеid_hotelintИдентификатор гостинцы. Первичный ключ. id_adressintИдентификатор адреса. По нему находится адресная информация о гостинице. id_metaintИдентификатор мета-данных. По нему находится информация о мета-тегах гостиницы. id_createdintИдентификатор создания. По нему находится информация о первом внесении информации о гостинице в базу данных. id_modifyintИдентификатор изменений. По нему находится информация о последних изменениях данных о гостинице. id_hotel_typeintИдентификатор типа гостиницы. По нему находится информация о типе гостиницы (гостиница/отель…). id_serviceintИдентификатор услуг. По нему находится информация об услугах, предоставляемых гостиницей. id_reservingintИдентификатор бронирования. По нему находится информация об условиях бронирования гостиницы. id_publishintИдентификатор публикования. По нему находится информация о необходимости размещения информации о гостинице в общий доступ. namevarchar (70) Название гостиницы. starsintКатегории гостиницы (уровень звездности). numbersintОбщее количество номеров в гостинице. descriptiontextОписание гостиницы. sort_numintНомер списка. Используется для сортировки гостиниц.

Важными не только для описания гостиниц являются таблицы publish (таблица 3.7), modify (таблица 3.8), created (таблица 3.9), metas (таблица 3.10). Ссылки на них будут встречаться и в дальнейшем.

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

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


Таблица 3.7 - Описание таблицы publish базы данных

Названиетип данныхОписаниеid_publishintИдентификатор публикования. Первичный ключ. publishboolФлаг публикования. Ноль - не выводить на сайте. publish_startdatetimeВремя с которого можно выводить информацию на сайте (если publish=1). publish_finishdatetimeВремя до которого можно выводить информацию на сайте.

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


Таблица 3.8 - Описание таблицы modify базы данных

Названиетип данныхОписаниеid_modifyintИдентификатор изменений. Первичный ключ. id_userboolИдентификатор пользователя. Указывает на пользователя, внесшего соответствующее изменение. modify_datedatetimeВремя последнего изменения.

Таблица 3.9 - Описание таблицы created базы данных

Названиетип данныхОписаниеid_createdintИдентификатор создания. Первичный ключ. id_userboolИдентификатор пользователя. Указывает на пользователя, внесшего соответствующее изменение. create_datedatetimeВремя создания.

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


Таблица 3.10 - Описание таблицы metas базы данных

Названиетип данныхОписаниеid_metaintИдентификатор мета-данных. titleboolЗаголовок Интернет-страницы. keywordsdatetimeКлючевые слова Интернент-страницы. descriptionОписание Интернет страницы.

Дополнительная информация о гостинице хранится в отдельных таблицах. Так, для описания условий бронирования каждой из гостиниц служит таблица reserving (таблица 3.11), а для описания предоставляемых гостиницей услуг - service (таблица 3.12).


Таблица 3.11 - Описание таблицы reserving базы данных

Названиетип данныхОписаниеid_reservingintИдентификатор условий бронирования. Первичный ключ. conditionsvarchar (255) Условия бронированияannulationvarchar (255) Условия аннуляции. arrival_timedatetimeВремя и дата прибытия (заезда). departure_timedatetimeВремя и дата выезда.

Таблица 3.12 - Описание таблицы service базы данных

Названиетип данныхОписаниеid_serviceintИдентификатор списка услуг. Первичный ключ. excurtionboolЗаказ экскурсий. 24hour_servicebool24ч обслуживание в номерах. car_parkingboolАвтостоянка. currency_exchangeboolОбмен валюты. hairdressingboolПарикмахерская. safeboolСейф у администратора. ticket_reservationboolЗаказ авиа и ж/д билетов. baggage_roomboolКамера хранения багажа. smokingboolКурение в номере. dry_cleanerboolХимчистка. shopsboolМагазины. guard_stationboolПост охраны. transport_reservatuionboolЗаказ транспорта. internet_accessboolДоступ в Интернет. jacuzziboolДжакузи. wash_houseboolПрачечная. first_aid_postboolМедпункт. additionalvarchar (255) Дополнительные услуги, которые не входят в заранее определенный список.

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


3.1.2.1 Разработка структуры представления адреса гостиниц

Структура адреса гостиниц (рисунок 3.3) является универсальной, она не привязана непосредственно к гостиницам и может использоваться где угодно.


Рисунок 3.3 - ER-диаграмма адреса гостиницы


Центральным элементом в структуре адреса выступает таблица address (таблица 3.13). Она включает в себя, на первый взгляд, избыточную связь с таблицей city (таблица 3.15), но это сделано специально, т.к. ряд городов просто не имеет районов.

Таблица 3.13 - Описание таблицы adress базы данных

Названиетип данныхОписаниеid_adressintИдентификатор адреса. Первичный ключ. Id_regionintИдентификатор региона. Id_cityintИдентификатор города. Id_street_typeintИдентификатор типа улицы (улица/проспект/переулок…). Street_namevarchar (70) Название улицы. HouseintНомер дома. BuildingintКорпус. ApartmentintНомер квартиры. Post_indexintПочтовый индекс.

Таблицы country (таблица 3.14), city (таблица 3.15) и region (таблица 3.16) служат для описания страны, города и района соответственно.


Таблица 3.14 - Описание таблицы country базы данных

Названиетип данныхОписаниеid_countryintИдентификатор страны. Первичный ключ. countryvarchar (70) Название страны.

Таблица 3.15 - Описание таблицы city базы данных

Названиетип данныхОписаниеid_cityintИдентификатор города. Первичный ключ. id_countryintИдентификатор страны. Указывает на страну, к которой относится город. cityvarchar (70) Название города.

Таблица 3.16 - Описание таблицы region базы данных

Названиетип данныхОписаниеid_regionintИдентификатор раона. Первичный ключ. id_cityintИдентификатор города. Указывает на город, к которому относится район. regionvarchar (70) Название района.

В таблице street_type (таблица 3.17) хранится информация о типе улицы. Например: улица, проспект, переулок, шоссе и т.д.


Таблица 3.17 - Описание таблицы street_type базы данных

Названиетип данныхОписаниеid_street_typeintИдентификатор типа улицы. Первичный ключ. namevarchar (70) Название типа улицы.

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


3.1.2.2 Разработка структуры представления телефонов гостиниц

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


Рисунок 3.4 - ER-диаграмма телефонов гостиницы


Основой структуры выступает таблица phone (таблица 3.18). Важно, что структура предусматривает различные типы телефонов, например: факс, обычный телефон, многоканальный телефон. Соответствующая информация хранится в таблице phone_type (таблица 3.19).


Таблица 3.18 - Описание таблицы street_type базы данных

Названиетип данныхОписаниеid_phoneintИдентификатор телефона. Первичный ключ. id_phone_typeintИдентификатор типа телефона. codeintКод телефона. numberintНомер телефонаdescriptionvarchar (255) Описание телефона

Таблица 3.19 - Описание таблицы phone_type базы данных

Названиетип данныхОписаниеid_phone_typeintИдентификатор типа телефона. Первичный ключ. namevarchar (10) Название типа телефона.

Многие гостиницы имеют несколько телефонов, поэтому для обеспечения связи "многие ко многим" используется дополнительная таблица hotel_phone (таблица 3.20), а для того, чтобы различать телефоны между собой можно хранить описание телефонов в таблице phone.


Таблица 3.20 - Описание таблицы hotel_phone базы данных

Названиетип данныхОписаниеid_hotelintИдентификатор гостиницы. id_phoneintИдентификатор телефона.

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


3.1.2.3 Разработка структуры представления номеров гостиниц

По желанию заказчика система предусматривает введение информации о различных номерах гостиницы. Соответствующую этому ER-диаграмму можно увидеть на рисунке 3.5.


Рисунок 3.5 - ER-диаграмма номеров гостиницы


Естественно, здесь главным элементом выступает таблица number (таблица 3.21). Именно в ней заложена связь номеров с соответствующими им гостиницами (поле id_hotel). В структуре присутствуют уже встречавшиеся ранее таблицы publish (таблица 3.7), modify (таблица 3.8) и created (таблица 3.9). Они предназначены для определения необходимости вывода информации о номере, хранения информации о последних изменениях и о создании соответственно.

Таблица 3.21 - Описание таблицы number базы данных

Названиетип данныхОписаниеid_numberintИдентификатор номера. Первичный ключ. id_hotelintИдентификатор гостиницы. Указатель на гостиницу, к которой относится номер. id_publishintИдентификатор публикования. По нему находится информация о необходимости размещения информации о номере в общий доступ. id_createdintИдентификатор создания. По нему находится информация о первом внесении информации о номере в базу данных. id_modifyintИдентификатор изменений. По нему находится информация о последних изменениях данных о номере. namevarchar (70) Название номера. num_of_numbersintКоличество номеров соответствующего типа. descriptiontextОписание номера. list_numintСортировочный номер. Требуется для сортировки номеров в списке между собой.

Для хранения информации о стоимости каждого из номеров требуется 2 таблицы: period (таблица 3.22) и price (таблица 3.23). Дело в том, что в различные периоды спрос на гостиницы различен, а значит различны и цены, поэтому за счет таблицы period задается интервал, которому будет соответствовать цена, а за счет таблицы price уже непосредственно сама стоимость проживания.


Таблица 3.22 - Описание таблицы period базы данных

Названиетип данныхОписаниеid_periodintИдентификатор периода. Первичный ключ. id_hotelintИдентификатор гостиницы. Указывает, к какой гостинице относится данный период. start_datedateДата с которой будут вступать в действие соответствующие периоду цены. finish_datedateДата до которой будут действительны соответствующие периоду цены.

Таблица 3.23 - Описание таблицы price базы данных

Названиетип данныхОписаниеid_priceintИдентификатор цен. Первичный ключ. id_numberintИдентификатор номера. Указывает, к какому номеру относятся цены. id_periodintИдентификатор периода. Указывает на период к которому относятся цены. priceintСтоимость одноместного размещения. price2intСтоимость двухместного размещения.

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


3.1.3 Разработка структуры представления заявок

Важным элементом является система заявок на бронирование номеров в отелях города. Ее структура представлена на рисунке 3.6.


Рисунок 3.6 - ER-диаграмма номеров гостиницы


Центральным элементом в структуре выступает таблица demand (таблица 3.24). Она содержит в себе всю необходимую информацию или ссылки на нее. В частности в ней содержатся идентификаторы бронируемых гостиницы и номера в ней. Это не избыточные связи. Дело в том, что бывают случаи, когда клиент выбрал гостиницу, но не определился с номером в ней.


Таблица 3.24 - Описание таблицы demand базы данных

Названиетип данныхОписаниеid_demandintИдентификатор заявки. Первичный ключ. Id_personintИдентификатор личности. Указатель на информацию о человеке, сделавшем заказ. Id_phoneintИдентификатор телефона. Указатель на информацию о телефоне для связи. Id_statusintИдентификатор статуса заявки. Определяет степень обработки заявки (не рассмотрена, в обработке, выполнена и т.д.) id_price_typeintИдентификатор типа оплаты. Определяет предпочитаемый клиентом способ оплаты. Id_transferintИдентификатор трансфера. Определяет требуются ли клиенту трансферные услуги. Id_hotelintИдентификатор гостиницы. Указывает на гостиницу, в которой желает поселиться клиент. Id_numberintИдентификатор номера. Указывает на номер, в котором желает поселиться клиент. Id _connection_typeintИдентификатор типа связи. Определяет предпочитаемый клиентом способ связи (e-mail, телефон и прочие). Commentsvarchar (255) Комментарии, которые может оставить к заявке администратор. Min_priceintМинимальная цена, которую готов платить клиент за проживание. Max_priceintМаксимальная цена, которую готов платить клиент за проживание. WishestextДополнительные пожелания клиента.

В таблице demand содержится ряд указателей на таблицы, которые помимо идентификатора содержат лишь поле name: transfer (таблица 3.25), status (таблица 3.26), price_type (таблица 3.27), connection_type (таблица 3.28). Все эти таблицы содержат строго определенный заказчиком перечень значений, который представлены в соответствующих таблицах (список значений может быть расширен).


Таблица 3.25 - Описание таблицы demand базы данных

Названиетип данныхОписаниеid_transferintИдентификатор трансфера. Первичный ключ. namevarchar (40) Возможные значения: Без трансфера, От аэропорта до гостиницы, От вокзала до гостиницы.

Таблица 3.26 - Описание таблицы status базы данных

Названиетип данныхОписаниеid_statusintИдентификатор статуса заявки. Первичный ключ. namevarchar (40) Возможные значения: Не рассмотрена, Отклонена, В обработке, Выполнена.

Таблица 3.27 - Описание таблицы price_type базы данных

Названиетип данныхОписаниеid_price_type intИдентификатор типа оплаты. Первичный ключ. namevarchar (70) Возможные значения: Наличными, Перевод от физического лица, Перевод от юридического лица.

Таблица 3.28 - Описание таблицы connection_type базы данных

Названиетип данныхОписаниеid_connection_typeintИдентификатор типа связи. Первичный ключ. namevarchar (20) Возможные значения: По телефону, По электронной почте, С помощью icq.

Также для полного описания заявки используется описанная ранее таблица phone (таблица 3.18) и таблица person (таблица 3.29), содержащая необходимую информацию непосредственно о клиетне.


Таблица 3.29 - Описание таблицы person базы данных

Названиетип данныхОписаниеid_personintИдентификатор личности. Первичный ключ. id_cityintИдентификатор города. Указывает на город, из которого приезжает клиент. surnamevarchar (70) Фамилия клиента. namevarchar (70) Имя клиента. emailvarchar (150) Электронный адрес клиента.

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

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


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


3.2.1 Разработка структуры фотогалереи

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


Рисунок 3.6 - ER-диаграмма фотогалерей номеров и гостиниц


Любая фотогалерея прежде всего состоит непосредственно из самих фотографий (далее для общности изображений), для описания которых служит таблица image (таблица 3.30).

Таблица 3.30 - Описание таблицы image базы данных

Названиетип данныхОписаниеid_imageintИдентификатор изображения. Первичный ключ. id_folderintИдентификатор папки. Указывает на папку, в которой лежит данная фотография. id_createdintИдентификатор создания. По нему находится информация о первом внесении информации об изображении в базу данных. id_modifyintИдентификатор создания. По нему находится информация о последних изменениях данных об изображении. namevarchar (150) Название фотографии. altvarchar (150) Альтернативный текст для изображения. Выводится, если броузер по каким-либо причинам не может показать изображение, или при наведении на него. widthintШирина изображения в пикселях. heightintВысота изображения в пикселях. sizeintРазмер изображения в байтах.

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

Таблица folder (таблица 3.31) содержит информацию о папке, в которую записан соответствующий файл. В данном случае это фотография.


Таблица 3.31 - Описание таблицы folder базы данных

Названиетип данныхОписаниеid_folderintИдентификатор папки. Первичный ключ. fol_id_folderintИдентификатор папки. Указывает на папку, в которой лежит данная папка. id_createdintИдентификатор создания. По нему находится информация о первом внесении информации об изображении в базу данных. id_metaintИдентификатор мета данных. По нему находится информация о мета-данных по умолчанию для страниц, лежащих в данной папке. namevarchar (150) Логической название папки. folder_adressvarchar (150) Физическое название папки.

За формирований фотогалерей отвечают отдельные таблицы number_galery (таблица 3.32) и hotel_galery (таблица 3.33). По идентификатору номера или гостинцы можно найти те фотографии, которые к ним относятся, а значит и сформировать фотогалерею.


Таблица 3.32 - Описание таблицы number_galery базы данных

Названиетип данныхОписаниеid_numberintИдентификатор номера. Первичный ключ. id_imageintИдентификатор изображения. Первичный ключ. list_numintСортировочный номер. Позволяет сортировать изображения в фотогалерее.

Таблица 3.33 - Описание таблицы hotel_galery базы данных

Названиетип данныхОписаниеid_hotelintИдентификатор гостиницы. Первичный ключ. id_imageintИдентификатор изображения. Первичный ключ. list_numintСортировочный номер. Позволяет сортировать изображения в фотогалерее.

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


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

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


Рисунок 3.7 - ER-диаграмма шаблонов страниц сайта


Центральным элементом в структуре шаблонов является таблица template (таблица 3.34). Он отвечает за сбор частей шаблона воедино.


Таблица 3.34 - Описание таблицы template базы данных

Названиетип данныхОписаниеid_templateintИдентификатор шаблона. Первичный ключ. id_headintИдентификатор заголовка. Указывает на информацию о заголовочных данных страниц, относящихся к шаблону. id_blockintИдентификатор блока кода. Указывает на основной блок, отвечающий за формирование html-документа. namevarchar (70) Название шаблона.

Дополнительно для описания шаблона служат таблицы head (таблица 3.35) и block (таблица 3.36). Таблица head описывает ту часть шаблона, которая находится до тега <body /> в html-документах. Это мета-данные (помимо уже описанных в таблице 3.10); дополнительно подключаемые файлы, к которым относятся Java-скрипты и css-файлы. Таблица block содержит код, который лежит в теге <body />. Причем такой код может включать подблоки. Для вставки подблоков идентификатор подблока записывается в фигурные скобки через символ # (например: {#21}).


Таблица 3.35 - Описание таблицы head базы данных

Названиетип данныхОписаниеid_headintИдентификатор заголовка. Первичный ключ. namevarchar (70) Название заголовка. head_texttextТекст заголовка.

Таблица 3.36 - Описание таблицы block базы данных

Названиетип данныхОписаниеid_blockintИдентификатор блока кода. Первичный ключ. Namevarchar (70) Название блока кода. Block_texttextТекст блока кода.

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


3.2.3 Разработка структуры отдельных страниц сайта

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


Рисунок 3.7 - ER-диаграмма отдельных страниц сайта


Основой в структуре отдельных страниц сайта выступает таблица page (таблица 3.37). Непосредственно же сама информация о страницах представлена в таблицах, на которые она ссылается.


Таблица 3.37 - Описание таблицы page базы данных

Названиетип данныхОписаниеid_pageintИдентификатор страницы. Первичный ключ. id_templateintИдентификатор шаблоны. Указывает на шаблон, согласно которому должна отображаться данная страница. id_metaintИдентификатор мета-данных. По нему находится информация о мета-тегах страницы. id_folderintИдентификатор папки. Указывает на папку, в которой расположена данная страница. idintИдентификатор автора. Указывает на информацию о стороннем источники, если такой имеется. id_publishintИдентификатор публикования. По нему находится информация о необходимости размещения данной страницы в общий доступ. id_createdintИдентификатор создания. По нему находится информация о первом внесении информации о странице в базу данных. id_modifyintИдентификатор изменений. По нему находится информация о последних изменениях страницы. namevarchar (150) Название (заголовок) страницы. file_namevarchar (255) Название файла, которому соответствует данная страница.

Практически все таблицы, на которые ссылается таблица page, уже рассматривались ранее: publish (таблица 3.7), modify (таблица 3.8), created (таблица 3.9), metas (таблица 3.10), folder (таблица 3.31). Исключение составляет лишь таблица authorship (таблица 3.38). Она предназначена для описания данных, берущихся со сторонних источников с целью сохранения авторских прав их владельцами.


Таблица 3.38 - Описание таблицы authorship базы данных

Названиетип данныхОписаниеidintИдентификатор автора. Первичный ключ. authornamevarchar (70) Имя автора. sourcevarchar (255) Ссылка на источник информации.

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


Таблица 3.39 - Описание таблицы visits базы данных

Названиетип данныхОписаниеid_visitsintИдентификатор посетителя. Первичный ключid_sessionintИдентификатор сессии. Указывает на сессию, соответствовавшую данному посетителю. hitsintКоличество хитов посетителя. first_enterdatetimeВремя и дата первого посещения. last_enterdatetimeВремя и дата последнего посещения. ipvarchar (16) IP-адрес посетителя. location_historyvarchar (255) Информация о странице, с которой посетитель пришел на сайт.

Таблица 3.40 - Описание таблицы page_views базы данных

Названиетип данныхОписаниеid_pageintИдентификатор страницы. Первичный ключ. id_visitsintИдентификатор посетителя. Первичный ключ. view_datedatetimeВремя и дата последнего просмотра страницы посетителем.

Во-вторых, система предусматривает формирование из группы отдельных страниц новостных разделов, статей по определенной теме и просто меню. Реализация этой задачи основана на таблице special_pages (таблица 3.41), которая отвечает за формирование групп страниц, и таблице page_type (таблица 3.42), которая определяет тип страниц в таких группах (новость, статья и т.д.).


Таблица 3.41 - Описание таблицы special_pages базы данных

Названиетип данныхОписаниеid_spec_pageintИдентификатор специальной страницы. Первичный ключ. id_pageintИдентификатор страницы. Указывает на страницу, которая входит в соответствующий блокid_page_typeintИдентификатор типа страницы. Указывает к какой группе относится страница (новость, статья и т.д.) announcementtextАнонс. Краткое изложение содержания страницы. datedateДата.

Таблица 3.42 - Описание таблицы page_type базы данных

Названиетип данныхОписаниеid_page_typeintИдентификатор типа страницы. Первичный ключ. namevarchar (20) Фиксированный набор значений: Новость, Статья, Пункт Меню.

3.2.3 Разработка структуры голосований и опросов

Очередным дополнительным модулем, предусматриваемым системой является модуль голосований и опросов. Его ER-диаграмма представлена на рисунке 3.8.


Рисунок 3.8 - ER-диаграмма голосований и опросов


Для описания тем голосований или вопросов служит таблица voiting (таблица 3.43), а за голоса отвечает таблица answers (таблица 3.44). Также в структуре присутствуют таблицы metas, modify и created, назначение которых очевидно.


Таблица 3.43 - Описание таблицы voiting базы данных

Названиетип данныхОписаниеid_voitingintИдентификатор голосования (опроса). Первичный ключ. namevarchar (70) Название голосования (опроса). questionvarchar (255) Вопрос. start_datedatetimeНачало действия голосования. finish_datedatetimeКонец действия голосования.

Таблица 3.44 - Описание таблицы special_pages базы данных

Названиетип данныхОписаниеid_answerintИдентификатор ответа. Первичный ключ. id_voitingintИдентификатор голосования (опроса) id_createdintИдентификатор создания. По нему находится информация о первом внесении информации об ответе в базу данных. id_modifyintИдентификатор изменений. По нему находится информация о последних изменениях об ответе. id_metaintИдентификатор мета-данных. По нему находится информация о мета-тегах ответов. answervarchar (150) Ответ. numintКоличество ответов.

4. Разработка Пользовательского интерфейса системы управления сайтом и заявками на бронирование номеров


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


4.1 Система управления сайтом


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


Рисунок 4.1 - список гостиниц. Сортировка по названию по возрастанию.


4.1.1 Работа со списками элементов в системе управления сайтом

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


Рисунок 4.2 - список гостиниц. Сортировка по дате изменения по возрастанию.


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


Рисунок 4.3 - список гостиниц. Сортировка по идентификатору по возрастанию.


Рисунок 4.4 - список гостиниц. Сортировка по идентификатору по убыванию.


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


Рисунок 4.5 - список гостиниц. Сортировка по сортировочному номеру по возрастанию.


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

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

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

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


Рисунок 4.6 - редактирование гостиницы. Общая информация.


4.1.2 Работа с отдельными элементами системы управления сайтом

При переходе к редактированию гостиниц открывается форма с набором вкладок:

·Общая информация;

·Контакты и адреса;

·Периоды;

·Номера;

·Мета-данные.

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

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

Вкладка Контакты и адреса (рисунок 4.7) отвечает соответственно за редактирование контактной информации. Для добавления дополнительных телефонов необходимо нажать на кнопку +.


Рисунок 4.7 - редактирование гостиницы. Контакты и адреса.


За информацию о номерах гостиницы отвечает сразу две вкладки Периоды (рисунок 4.8), в которой формируются интервалы действия стоимостей номеров и непосредственно номера (рисунок 4.9).


Рисунок 4.8 - редактирование гостиницы. Периоды.


Рисунок 4.9 - редактирование гостиницы. Номера.


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

По желанию заказчика была также добавлена вкладка Мета-данные (рисунок 4.10).


Рисунок 4.10 - редактирование гостиницы. Мета-данные.


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


4.2 Система управления заявками на бронирование номеров в отелях


Работа с заявками очень похожа на работу с информацией о гостиницах. Тот же интерфейс как при работе со списками (рисунок 4.11), так и при обработке конкретных элементов (рисунок 4.12). Поэтому он не требует дополнительных комментариев.


Рисунок 4.10 - список заявок. Сортировка по фамилии клиента по возрастанию.


Рисунок 4.10 - редактирование заявки. Общая информация.


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

Заключение


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

Разработана система управления сайтом и заявками на бронирование номеров в отелях города.

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

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

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

Список литературы


1.Эд Леки-Томпсон и др. PHP5 для профессионалов. - М.: Вильямс, 2006. - 608 с.

2.Сравнительные особенности современных CMS. - Internet.ru, 22 декабря 2005 г.

.А. Моисеев. На том стоим. - Журнал "Компьютерра", №32, 08 сентября 2005 г.

.CMSlist.ru, 2005 г.

.А. Терехов. Сравниваем контент-менеджеры. - Cmslist.ru, 2005 г.

.Закас Н., Мак-Пик Д., Фосетт Д. Ajax для профессионалов. - СПб: Символ-Плюс, 2006. - 488 с.

7.#"center">Приложение А - Листинг программы


В целях сокращения объема в приложении приведена лишь наиболее важная часть кода программы.

class. Database. php

<?_once ($cfg ['path'] ['base']. "classes/class. Database. php"); // Подключаем класс по работе с БД

require_once ($cfg ['path'] ['base']. "classes/class. GenericObject. php"); // Подключаем класс по работе с объектами

require_once ($cfg ['path'] ['base']. "classes/class. GenericObjectCollection. php"); // Подключаем класс по работе с коллекциями объектов

require_once ($cfg ['path'] ['base']. "classes/class. Hotel. php"); // Подключаем класс гостиницHotelCollection {$order;$where;$select;$items_per_page = 20;$item_count;$page_count;$objDB; // Класс БД

// конструкторfunction __construct ($objDBlink) {$cfg;

$this->select = "SELECT id_hotel FROM". $cfg ['table'] ['hotel'];

$this->order = "";

$this->where = "";

$this->objDB = $objDBlink; // Запоминаем объект БД

return (true); //

}

// Функция устанавливает количество элементов на странице

public function SetItemsPerPage ($items_per_page) {

$this->items_per_page = $items_per_page;

}

// Функция возвращает количество элементов на странице

public function GetItemsPerPage () {($this->items_per_page);

}

// Функция возвращает количество элементов в коллекции

public function GetItemCount () {($this->item_count);

}

// Функция возвращает количество страницfunction GetPageCount () {($this->page_count);

}

// Функция устанавливает значение переменной select

public function SetSelect ($select) {

$this->select = $select;

}

// Функция устанавливает значение переменной wherefunction SetWhere ($where) {

$this->where = $where;

}

// Функция устанавливает значение переменной order

public function SetOrder ($order) {

$this->order = $order;

}function GetAllHotels ($page_num=1) {$cfg;

$dbc = new GenericObjectCollection ($cfg ['table'] ['hotel'], "id_hotel", "Hotel", $this->objDB);

$stmt = "SELECT id_hotel FROM". $cfg ['table'] ['hotel']; // формируем запрос

$arResult = $this->objDB->select ($stmt); // Выполняем запрос($i=0; $i<=sizeof ($arResult) - 1; $i++) {

$dbc->AddTuple ($arResult [$i] ["id_hotel"]);

};

$dbc->SetPageSize ($this->items_per_page);

$dbc->PopulateObjectArray ($page_num);

$objArray = $dbc->RetrievePopulatedObjects ($page_num);

$this->item_count = $dbc->GetItemCount ();

$this->page_count = $dbc->GetNumPages ();($objArray);

}function GetFromClass ($page_num=1) {$cfg;

$dbc = new GenericObjectCollection ($cfg ['table'] ['hotel'], "id_hotel", "Hotel", $this->objDB);

// формируем запрос

$stmt = "";

$stmt. = $this->select;

$stmt. = $this->where;

$stmt. = $this->order;

$arResult = $this->objDB->select ($stmt); // Выполняем запрос($i=0; $i<=sizeof ($arResult) - 1; $i++) { // проходим все элементы

$dbc->AddTuple ($arResult [$i] ["id_hotel"]); // Записываем соответствующие id

};

$dbc->SetPageSize ($this->items_per_page); // Переписали данные о количестве элементов на страницу

$dbc->PopulateObjectArray ($page_num); // Составили список требуемых id

$objArray = $dbc->RetrievePopulatedObjects ($page_num); // получили массив требуемых элементов

$this->item_count = $dbc->GetItemCount (); // запомнили количество элементов

$this->page_count = $dbc->GetNumPages (); // запомнили количество страниц($objArray); // Возвращаем массив значений

}

}

? >

class. UserSession. php

<?_once ($cfg ['path'] ['base']. "classes/class. Database. php"); // Подключаем класс по работе с БД

require_once ($cfg ['path'] ['base']. "classes/class. GenericObject. php"); // Подключаем класс по работе с объектами

require_once ($cfg ['path'] ['base']. "classes/class. GenericObjectCollection. php"); // Подключаем класс по работе с коллекциями объектов

require_once ($cfg ['path'] ['base']. "classes/class. Hotel. php"); // Подключаем класс гостиницHotelCollection {$order;$where;$select;$items_per_page = 20;$item_count;$page_count;$objDB; // Класс БД

// конструкторfunction __construct ($objDBlink) {$cfg;

$this->select = "SELECT id_hotel FROM". $cfg ['table'] ['hotel'];

$this->order = "";

$this->where = "";

$this->objDB = $objDBlink; // Запоминаем объект БД

return (true); //

}

// Функция устанавливает количество элементов на странице

public function SetItemsPerPage ($items_per_page) {

$this->items_per_page = $items_per_page;

}

// Функция возвращает количество элементов на странице

public function GetItemsPerPage () {($this->items_per_page);

}

// Функция возвращает количество элементов в коллекции

public function GetItemCount () {($this->item_count);

}

// Функция возвращает количество страницfunction GetPageCount () {($this->page_count);

}

// Функция устанавливает значение переменной select

public function SetSelect ($select) {

$this->select = $select;

}

// Функция устанавливает значение переменной wherefunction SetWhere ($where) {

$this->where = $where;

}

// Функция устанавливает значение переменной order

public function SetOrder ($order) {

$this->order = $order;

}function GetAllHotels ($page_num=1) {$cfg;

$dbc = new GenericObjectCollection ($cfg ['table'] ['hotel'], "id_hotel", "Hotel", $this->objDB);

$stmt = "SELECT id_hotel FROM". $cfg ['table'] ['hotel']; // формируем запрос

$arResult = $this->objDB->select ($stmt); // Выполняем запрос($i=0; $i<=sizeof ($arResult) - 1; $i++) {

$dbc->AddTuple ($arResult [$i] ["id_hotel"]);

};

$dbc->SetPageSize ($this->items_per_page);

$dbc->PopulateObjectArray ($page_num);

$objArray = $dbc->RetrievePopulatedObjects ($page_num);

$this->item_count = $dbc->GetItemCount ();

$this->page_count = $dbc->GetNumPages ();($objArray);

}function GetFromClass ($page_num=1) {$cfg;

$dbc = new GenericObjectCollection ($cfg ['table'] ['hotel'], "id_hotel", "Hotel", $this->objDB);

// формируем запрос

$stmt = "";

$stmt. = $this->select;

$stmt. = $this->where;

$stmt. = $this->order;

$arResult = $this->objDB->select ($stmt); // Выполняем запрос($i=0; $i<=sizeof ($arResult) - 1; $i++) { // проходим все элементы

$dbc->AddTuple ($arResult [$i] ["id_hotel"]); // Записываем соответствующие id

};

$dbc->SetPageSize ($this->items_per_page); // Переписали данные о количестве элементов на страницу

$dbc->PopulateObjectArray ($page_num); // Составили список требуемых id

$objArray = $dbc->RetrievePopulatedObjects ($page_num); // получили массив требуемых элементов

$this->item_count = $dbc->GetItemCount (); // запомнили количество элементов

$this->page_count = $dbc->GetNumPages (); // запомнили количество страниц($objArray); // Возвращаем массив значений

}

}

? >

class. GenericObject. php

<?

// Класс "Объект" - предназначен для сокращения кода его наследников

class GenericObject {

// Члены класса

protected $objDB; // Класс БД

private $id; // id элемента

private $id_name; // Обозначение id элемента$table_name; // Имя таблицы$database_fields; // Ассоциативный массив с ключами, которые являются именами столбцов таблицы и их значениями для данной строки$loaded; // Ноль, если данные не были загружены из таблицы - один, если данные были загружены$modified; // флаг того, что изменения вносились$modified_fields; // Аналогичен database_fields, но содержит 0 или 1 в зависимости от того были ли произведены изменения

// методы

// Функция перезагрузки

// Загружает всю информацию об элементе

public function Reload () {

// $sql = new sql (0);

$id = $this->id; // Запоминаем id

$table_name = $this->table_name; // запоминаем имя таблицы

// $sql->query ("SELECT * FROM $table_name WHERE id='$id'"); // формируем запрос

$stmt = "SELECT * FROM $table_name WHERE". $this->id_name. "='$id'"; // формируем запрос

$arResult = $this->objDB->select ($stmt); // Выполняем запрос(isset ($arResult [0])) {

$result_fields = $arResult [0]; // Копируем первую строку

$this->database_fields = $result_fields; // Переписываем полученный результат в нащ объект

$this->loaded = 1; // Устанавливаем статус загрузки(sizeof ($this->modified_fields) > 0) { // Если есть массив с изменениями

foreach ($this->modified_fields as $key => $value) { // То обнуляем все его элементы

$this->modified_fields [$key] = false;

};

};

}

}

// Функция зарузки

// Загружает всю информацию об элементе

private function Load () {

$this->Reload ();

// $this->loaded = 1;

}

// Функция принудительной загрузкиfunction ForceLoaded () {

$this->loaded = 1;

}

// Функция возвращает значение поля

// Ей передается имя поляfunction GetField ($field) {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};(isset ($this->database_fields [$field]))$this->database_fields [$field];

else return false;

}

// Функция возвращает весь массив значений элементаfunction GetAllFields () {($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};($this->database_fields);

}

// Функция возвращает ассоциативный массив полей, которые были изменены

public function GetModifiedFields () {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};

$escVals = array (); // Выходной массив значений($this->database_fields as $key => $value) {(! is_numeric ($key)) {(isset ($this->modified_fields [$key]))($this->modified_fields [$key] == true) { // Если поле было изменено

$escVals [$key] = $value;

};

};

};($escVals);

}

// Функция возвращает id текущего элементаfunction GetID () {

return $this->id;

}

// Функция инициализации

// задает имя таблицы,

// id

// и id (но не обязательно)

public function Initialize ($table_name, $tuple_id_name, $tuple_id = "") {

$this->table_name = $table_name;

$this->id_name = $tuple_id_name;

$this->id = $tuple_id;

}

// функция Задает значение $value в поле $field

public function SetField ($field, $value) {

if ($this->loaded == 0) { // Если данные еще не были загружены,($this->id) { // и у нас есть конкретный id

$this->Load (); // то мы их загружаем

};

};

$this->database_fields [$field] = $value; // Записываем значение

$this->modified = 1; // Устанавливаем флаг того, что мы вносили изменения

$this->modified_fields [$field] = true; // Устанавливаем флаг того, что поле было изменено

}

// Функция удаления объектаfunction Destroy () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы($id) { // Если id задан

$this->objDB->delete ($table_name, array ($id_name => $id)); // Удаляем элемент из таблицы

// $sql = new sql (0);

// $stmt = "DELETE FROM ". $table_name. " WHERE id='". $id. "'";

// $sql->query ($stmt);

};

}

// Функция сохранения в БД

public function Save () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы

// $sql = new sql (0);

if (! $id) { // Если id не задан

$this->loaded = 0; // То устанавливаем, что элемент не был загружен

};($this->loaded == 0) { // Если элемент новый (не был загружен)

// Добавляем новую запись в таблицу БД

$this->objDB->insert ($table_name, $this->database_fields);

} else { // Если это не новый элемен

$return_code = $this->objDB->update ($table_name, $this->GetModifiedFields (), array ($id_name => $id));

};

// $return_code = $sql->query ($stmt, 1);

if ($this->loaded == 0) { // Если мы вставляли новый элемент

// Получаем последний вставленный id

$stmt = "SELECT MAX (". $this->id_name. ") AS id FROM $table_name WHERE ";($this->database_fields as $key => $value) {(! is_numeric ($key)) {($value) {($this->modified_fields [$key] == true) {

$value = str_replace ("'", "\'", $value);

$stmt. = "$key = '$value' AND ";

};

};

};

};

$stmt = substr ($stmt,0,strlen ($stmt) - 5); // Убираем лишние символы

$arResult = $this->objDB->select ($stmt); // Выполняем запрос

$proposed_id = $arResult [0] ["id"]; // Переписываем полученный id($proposed_id > 0) { // Если получили нормальный id

$this->loaded = 1; // значит все загружено

$this->id = $proposed_id; // Запоминаем id в объект

return true;

} else {false;

};

};($return_code);

}

};

class. GenericObjectCollection. php

<?

// Класс "Объект" - предназначен для сокращения кода его наследников

class GenericObject {

// Члены класса

protected $objDB; // Класс БД

private $id; // id элемента

private $id_name; // Обозначение id элемента$table_name; // Имя таблицы$database_fields; // Ассоциативный массив с ключами, которые являются именами столбцов таблицы и их значениями для данной строки$loaded; // Ноль, если данные не были загружены из таблицы - один, если данные были загружены$modified; // флаг того, что изменения вносились$modified_fields; // Аналогичен database_fields, но содержит 0 или 1 в зависимости от того были ли произведены изменения

// методы

// Функция перезагрузки

// Загружает всю информацию об элементе

public function Reload () {

// $sql = new sql (0);

$id = $this->id; // Запоминаем id

$table_name = $this->table_name; // запоминаем имя таблицы

// $sql->query ("SELECT * FROM $table_name WHERE id='$id'"); // формируем запрос

$stmt = "SELECT * FROM $table_name WHERE". $this->id_name. "='$id'"; // формируем запрос

$arResult = $this->objDB->select ($stmt); // Выполняем запрос(isset ($arResult [0])) {

$result_fields = $arResult [0]; // Копируем первую строку

$this->database_fields = $result_fields; // Переписываем полученный результат в нащ объект

$this->loaded = 1; // Устанавливаем статус загрузки(sizeof ($this->modified_fields) > 0) { // Если есть массив с изменениями

foreach ($this->modified_fields as $key => $value) { // То обнуляем все его элементы

$this->modified_fields [$key] = false;

};

};

}

}

// Функция зарузки

// Загружает всю информацию об элементе

private function Load () {

$this->Reload ();

// $this->loaded = 1;

}

// Функция принудительной загрузкиfunction ForceLoaded () {

$this->loaded = 1;

}

// Функция возвращает значение поля

// Ей передается имя поляfunction GetField ($field) {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};(isset ($this->database_fields [$field]))$this->database_fields [$field];

else return false;

}

// Функция возвращает весь массив значений элементаfunction GetAllFields () {($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};($this->database_fields);

}

// Функция возвращает ассоциативный массив полей, которые были изменены

public function GetModifiedFields () {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};

$escVals = array (); // Выходной массив значений($this->database_fields as $key => $value) {(! is_numeric ($key)) {(isset ($this->modified_fields [$key]))($this->modified_fields [$key] == true) { // Если поле было изменено

$escVals [$key] = $value;

};

};

};($escVals);

}

// Функция возвращает id текущего элементаfunction GetID () {

return $this->id;

}

// Функция инициализации

// задает имя таблицы,

// id

// и id (но не обязательно)

public function Initialize ($table_name, $tuple_id_name, $tuple_id = "") {

$this->table_name = $table_name;

$this->id_name = $tuple_id_name;

$this->id = $tuple_id;

}

// функция Задает значение $value в поле $field

public function SetField ($field, $value) {

if ($this->loaded == 0) { // Если данные еще не были загружены,($this->id) { // и у нас есть конкретный id

$this->Load (); // то мы их загружаем

};

};

$this->database_fields [$field] = $value; // Записываем значение

$this->modified = 1; // Устанавливаем флаг того, что мы вносили изменения

$this->modified_fields [$field] = true; // Устанавливаем флаг того, что поле было изменено

}

// Функция удаления объектаfunction Destroy () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы($id) { // Если id задан

$this->objDB->delete ($table_name, array ($id_name => $id)); // Удаляем элемент из таблицы

// $sql = new sql (0);

// $stmt = "DELETE FROM ". $table_name. " WHERE id='". $id. "'";

// $sql->query ($stmt);

};

}

// Функция сохранения в БДfunction Save () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы

// $sql = new sql (0);

if (! $id) { // Если id не задан

$this->loaded = 0; // То устанавливаем, что элемент не был загружен

};($this->loaded == 0) { // Если элемент новый (не был загружен)

// Добавляем новую запись в таблицу БД

$this->objDB->insert ($table_name, $this->database_fields);

} else { // Если это не новый элемен

$return_code = $this->objDB->update ($table_name, $this->GetModifiedFields (), array ($id_name => $id));

};

// $return_code = $sql->query ($stmt, 1);

if ($this->loaded == 0) { // Если мы вставляли новый элемент

// Получаем последний вставленный id

$stmt = "SELECT MAX (". $this->id_name. ") AS id FROM $table_name WHERE ";($this->database_fields as $key => $value) {(! is_numeric ($key)) {($value) {($this->modified_fields [$key] == true) {

$value = str_replace ("'", "\'", $value);

$stmt. = "$key = '$value' AND ";

};

};

};

};

$stmt = substr ($stmt,0,strlen ($stmt) - 5); // Убираем лишние символы

$arResult = $this->objDB->select ($stmt); // Выполняем запрос

$proposed_id = $arResult [0] ["id"]; // Переписываем полученный id($proposed_id > 0) { // Если получили нормальный id

$this->loaded = 1; // значит все загружено

$this->id = $proposed_id; // Запоминаем id в объект

return true;

} else {false;

};

};($return_code);

}

};

class. Hotel. php

<?

// Класс "Объект" - предназначен для сокращения кода его наследников

class GenericObject {

// Члены класса

protected $objDB; // Класс БД

private $id; // id элемента

private $id_name; // Обозначение id элемента$table_name; // Имя таблицы$database_fields; // Ассоциативный массив с ключами, которые являются именами столбцов таблицы и их значениями для данной строки$loaded; // Ноль, если данные не были загружены из таблицы - один, если данные были загружены$modified; // флаг того, что изменения вносились$modified_fields; // Аналогичен database_fields, но содержит 0 или 1 в зависимости от того были ли произведены изменения

// методы

// Функция перезагрузки

// Загружает всю информацию об элементе

public function Reload () {

// $sql = new sql (0);

$id = $this->id; // Запоминаем id

$table_name = $this->table_name; // запоминаем имя таблицы

// $sql->query ("SELECT * FROM $table_name WHERE id='$id'"); // формируем запрос

$stmt = "SELECT * FROM $table_name WHERE". $this->id_name. "='$id'"; // формируем запрос

$arResult = $this->objDB->select ($stmt); // Выполняем запрос(isset ($arResult [0])) {

$result_fields = $arResult [0]; // Копируем первую строку

$this->database_fields = $result_fields; // Переписываем полученный результат в нащ объект

$this->loaded = 1; // Устанавливаем статус загрузки(sizeof ($this->modified_fields) > 0) { // Если есть массив с изменениями

foreach ($this->modified_fields as $key => $value) { // То обнуляем все его элементы

$this->modified_fields [$key] = false;

};

};

}

}

// Функция зарузки

// Загружает всю информацию об элементе

private function Load () {

$this->Reload ();

// $this->loaded = 1;

}

// Функция принудительной загрузкиfunction ForceLoaded () {

$this->loaded = 1;

}

// Функция возвращает значение поля

// Ей передается имя поляfunction GetField ($field) {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};(isset ($this->database_fields [$field]))$this->database_fields [$field];

else return false;

}

// Функция возвращает весь массив значений элементаfunction GetAllFields () {($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};($this->database_fields);

}

// Функция возвращает ассоциативный массив полей, которые были изменены

public function GetModifiedFields () {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};

$escVals = array (); // Выходной массив значений($this->database_fields as $key => $value) {(! is_numeric ($key)) {(isset ($this->modified_fields [$key]))($this->modified_fields [$key] == true) { // Если поле было изменено

$escVals [$key] = $value;

};

};

};($escVals);

}

// Функция возвращает id текущего элементаfunction GetID () {

return $this->id;

}

// Функция инициализации

// задает имя таблицы,

// id

// и id (но не обязательно)

public function Initialize ($table_name, $tuple_id_name, $tuple_id = "") {

$this->table_name = $table_name;

$this->id_name = $tuple_id_name;

$this->id = $tuple_id;

}

// функция Задает значение $value в поле $field

public function SetField ($field, $value) {

if ($this->loaded == 0) { // Если данные еще не были загружены,($this->id) { // и у нас есть конкретный id

$this->Load (); // то мы их загружаем

};

};

$this->database_fields [$field] = $value; // Записываем значение

$this->modified = 1; // Устанавливаем флаг того, что мы вносили изменения

$this->modified_fields [$field] = true; // Устанавливаем флаг того, что поле было изменено

}

// Функция удаления объектаfunction Destroy () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы($id) { // Если id задан

$this->objDB->delete ($table_name, array ($id_name => $id)); // Удаляем элемент из таблицы

// $sql = new sql (0);

// $stmt = "DELETE FROM ". $table_name. " WHERE id='". $id. "'";

// $sql->query ($stmt);

};

}

// Функция сохранения в БД

public function Save () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы

// $sql = new sql (0);

if (! $id) { // Если id не задан

$this->loaded = 0; // То устанавливаем, что элемент не был загружен

};($this->loaded == 0) { // Если элемент новый (не был загружен)

// Добавляем новую запись в таблицу БД

$this->objDB->insert ($table_name, $this->database_fields);

} else { // Если это не новый элемен

$return_code = $this->objDB->update ($table_name, $this->GetModifiedFields (), array ($id_name => $id));

};

// $return_code = $sql->query ($stmt, 1);

if ($this->loaded == 0) { // Если мы вставляли новый элемент

// Получаем последний вставленный id

$stmt = "SELECT MAX (". $this->id_name. ") AS id FROM $table_name WHERE ";($this->database_fields as $key => $value) {(! is_numeric ($key)) {($value) {($this->modified_fields [$key] == true) {

$value = str_replace ("'", "\'", $value);

$stmt. = "$key = '$value' AND ";

};

};

};

};

$stmt = substr ($stmt,0,strlen ($stmt) - 5); // Убираем лишние символы

$arResult = $this->objDB->select ($stmt); // Выполняем запрос

$proposed_id = $arResult [0] ["id"]; // Переписываем полученный id($proposed_id > 0) { // Если получили нормальный id

$this->loaded = 1; // значит все загружено

$this->id = $proposed_id; // Запоминаем id в объект

return true;

} else {false;

};

};($return_code);

}

};

class. HotelCollection. php

<?

// Класс "Объект" - предназначен для сокращения кода его наследников

class GenericObject {

// Члены класса

protected $objDB; // Класс БД

private $id; // id элемента

private $id_name; // Обозначение id элемента$table_name; // Имя таблицы$database_fields; // Ассоциативный массив с ключами, которые являются именами столбцов таблицы и их значениями для данной строки$loaded; // Ноль, если данные не были загружены из таблицы - один, если данные были загружены$modified; // флаг того, что изменения вносились$modified_fields; // Аналогичен database_fields, но содержит 0 или 1 в зависимости от того были ли произведены изменения

// методы

// Функция перезагрузки

// Загружает всю информацию об элементе

public function Reload () {

// $sql = new sql (0);

$id = $this->id; // Запоминаем id

$table_name = $this->table_name; // запоминаем имя таблицы

// $sql->query ("SELECT * FROM $table_name WHERE id='$id'"); // формируем запрос

$stmt = "SELECT * FROM $table_name WHERE". $this->id_name. "='$id'"; // формируем запрос

$arResult = $this->objDB->select ($stmt); // Выполняем запрос(isset ($arResult [0])) {

$result_fields = $arResult [0]; // Копируем первую строку

$this->database_fields = $result_fields; // Переписываем полученный результат в нащ объект

$this->loaded = 1; // Устанавливаем статус загрузки(sizeof ($this->modified_fields) > 0) { // Если есть массив с изменениями

foreach ($this->modified_fields as $key => $value) { // То обнуляем все его элементы

$this->modified_fields [$key] = false;

};

};

}

}

// Функция зарузки

// Загружает всю информацию об элементе

private function Load () {

$this->Reload ();

// $this->loaded = 1;

}

// Функция принудительной загрузкиfunction ForceLoaded () {

$this->loaded = 1;

}

// Функция возвращает значение поля

// Ей передается имя поляfunction GetField ($field) {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};(isset ($this->database_fields [$field]))$this->database_fields [$field];

else return false;

}

// Функция возвращает весь массив значений элементаfunction GetAllFields () {($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};($this->database_fields);

}

// Функция возвращает ассоциативный массив полей, которые были изменены

public function GetModifiedFields () {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};

$escVals = array (); // Выходной массив значений($this->database_fields as $key => $value) {(! is_numeric ($key)) {(isset ($this->modified_fields [$key]))($this->modified_fields [$key] == true) { // Если поле было изменено

$escVals [$key] = $value;

};

};

};($escVals);

}

// Функция возвращает id текущего элементаfunction GetID () {

return $this->id;

}

// Функция инициализации

// задает имя таблицы,

// id

// и id (но не обязательно)

public function Initialize ($table_name, $tuple_id_name, $tuple_id = "") {

$this->table_name = $table_name;

$this->id_name = $tuple_id_name;

$this->id = $tuple_id;

}

// функция Задает значение $value в поле $field

public function SetField ($field, $value) {

if ($this->loaded == 0) { // Если данные еще не были загружены,($this->id) { // и у нас есть конкретный id

$this->Load (); // то мы их загружаем

};

};

$this->database_fields [$field] = $value; // Записываем значение

$this->modified = 1; // Устанавливаем флаг того, что мы вносили изменения

$this->modified_fields [$field] = true; // Устанавливаем флаг того, что поле было изменено

}

// Функция удаления объекта

public function Destroy () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы($id) { // Если id задан

$this->objDB->delete ($table_name, array ($id_name => $id)); // Удаляем элемент из таблицы

// $sql = new sql (0);

// $stmt = "DELETE FROM ". $table_name. " WHERE id='". $id. "'";

// $sql->query ($stmt);

};

}

// Функция сохранения в БД

public function Save () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы

// $sql = new sql (0);

if (! $id) { // Если id не задан

$this->loaded = 0; // То устанавливаем, что элемент не был загружен

};($this->loaded == 0) { // Если элемент новый (не был загружен)

// Добавляем новую запись в таблицу БД

$this->objDB->insert ($table_name, $this->database_fields);

} else { // Если это не новый элемен

$return_code = $this->objDB->update ($table_name, $this->GetModifiedFields (), array ($id_name => $id));

};

// $return_code = $sql->query ($stmt, 1);

if ($this->loaded == 0) { // Если мы вставляли новый элемент

// Получаем последний вставленный id

$stmt = "SELECT MAX (". $this->id_name. ") AS id FROM $table_name WHERE ";($this->database_fields as $key => $value) {(! is_numeric ($key)) {($value) {($this->modified_fields [$key] == true) {

$value = str_replace ("'", "\'", $value);

$stmt. = "$key = '$value' AND ";

};

};

};

};

$stmt = substr ($stmt,0,strlen ($stmt) - 5); // Убираем лишние символы

$arResult = $this->objDB->select ($stmt); // Выполняем запрос

$proposed_id = $arResult [0] ["id"]; // Переписываем полученный id($proposed_id > 0) { // Если получили нормальный id

$this->loaded = 1; // значит все загружено

$this->id = $proposed_id; // Запоминаем id в объект

return true;

} else {false;

};

};($return_code);

}

};


Содержание Перечень сокращений, обозначений, терминов Введение 1. Анализ задачи создания системы бронирования мест 1.1 Преимущества применения с

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ