Top Banner
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РЕСПУБЛИКИ КАЗАХСТАН Казахский национальный технический университет имени К.И. Сатпаева Кафедра технической кибернетики ДОПУЩЕН К ЗАЩИТЕ Зав. кафедрой д-р техн. наук, профессор ______________Д.Н.Шук аев “____” _____________2006 г. ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к дипломному проекту Тема Разработка автоматизированного рабочего места агента по недвижимости Консультант по экономической части ст. преподаватель каф. ЭП _________________Н.В.Кошкина “____” _________________2006 г. Консультант по охране труда канд. техн. наук, доцент каф. БТиЖ ___________________Ж.Т.Тяжин “____” _________________2006 г. Консультант по стандартизации Руководитель ст. преподаватель ________________Б.Б.Тусупова “____” _________________2006 г. Студент ________Ким Н.П. Специальность 370140, КСОИиУ Группа КСУ- 01- 4
173
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Аптека_ДИПЛОМ.doc

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РЕСПУБЛИКИ КАЗАХСТАН

Казахский национальный технический университет имени К.И. Сатпаева

Кафедра технической кибернетики

ДОПУЩЕН К ЗАЩИТЕЗав. кафедройд-р техн. наук, профессор ______________Д.Н.Шукаев“____” _____________2006 г.

ПОЯСНИТЕЛЬНАЯ ЗАПИСКАк дипломному проекту

Тема Разработка автоматизированного рабочего места агента по недвижимости

Консультант по экономической части ст. преподаватель каф. ЭП_________________Н.В.Кошкина “____” _________________2006 г.

Консультант по охране трудаканд. техн. наук, доцент каф. БТиЖ___________________Ж.Т.Тяжин“____” _________________2006 г.

Консультант по стандартизациист. преподаватель _________________Б.Б.Тусупова“____” _________________2006 г.

Рецензентканд.техн.наук, доценткаф.ИТ, АИЭС__________________И.И.Иванов“____” _________________2006 г.

Руководительст. преподаватель ________________Б.Б.Тусупова“____” _________________2006 г.

Студент ________Ким Н.П.Специальность 370140, КСОИиУГруппа КСУ- 01- 4

Алматы 2006

Page 2: Аптека_ДИПЛОМ.doc

2

Page 3: Аптека_ДИПЛОМ.doc

АҢДАТПА

Дипломдық жобада анықтамалық ақпараттық жүйе қарастырылады, дәрігерлік дәрілер және дәріханалар туралы қажетті мәліметтерді web - технологиялардың құралдарымен пайдалануына мүмкіндік береді. Өңделген web-қосымша, дәрігерлік дәрілерде сондай-ақ мынадай белгілермен қалай, аты , өндіруші фирма, бағасы , нөмірі бойынша қайсы дәріханада болтатыны және т.с. Web-сайт тұтынушылары тіркеуден өткеннен кейін көтерме тапсырыстарды өткізуге мүмкіншілігі болады. Достық web-интрефейсін қолданып, тап осы компания базасында сақталған мәліметтерді өшіруге, қосуға және түзетуге мүмкіншілік жасалған.СУБД ретінде MySQL Server таңдалған болатын, ал бағдарламалық қамтамасыз ету орындауына арналған Perl бағдарламалау тілі таңдалған болатын.

3

Page 4: Аптека_ДИПЛОМ.doc

THE SUMMARY

In the degree project the help information system which gives the necessary information on medical preparations and drugstores means of web-technologies is considered.

The developed web-appendix gives an opportunity of carrying out of high-speed information search about medical preparations by such criteria as, the name, firm the manufacturer, the price, number of a drugstore in which it is available, etc. There is an opportunity carrying out of wholesale orders, after passage of registration by clients. The opportunity of addition, removal and updatings of the information wich saved in a database of the company is created, using friendly web- interface.

As database it has been chosen MySQL Server, and for realization of the software programming language Perl has been chosen.

4

Page 5: Аптека_ДИПЛОМ.doc

АННОТАЦИЯ

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

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

В качестве СУБД была выбрана MySQL Server, а для реализации программного обеспечения был выбран язык программирования Perl.

5

Page 6: Аптека_ДИПЛОМ.doc

СОДЕРЖАНИЕ

ВВЕДЕНИЕ.................................................................................................................81 АНАЛИЗ СОВРЕМЕННОГО СОСТОЯНИЯ ВОПРОСОВ РАЗРАБОТКИ ИНТЕРАКТИВНЫХ WEB-ПРИЛОЖЕНИЙ..........................................................10

1.1 Обзор существующих web-ресурсов предоставляющих информацию о медицинских препаратах....................................................................................101.2 Законодательная основа Республики Казахстан “О лекарственных средствах”................................................................................................................131.3 Технологии создания web-приложений.........................................................16

1.3.1 Обзор протокола HTTP...........................................................................161.3.2 Обзор языка HTML..................................................................................171.3.3 Выполняемые сценарии JavaScript и VBScript..................................19

1.4 Обзор существующих методов создания DHTML........................................221.4.1 Обзор технологии CGI при создании интерактивных интерфейсов...............................................................................................................................221.4.2 Краткий обзор технологии PHP.............................................................251.4.3 Краткий обзор технологии ASP.............................................................271.4.4 Краткий обзор технологии JSP..............................................................291.4.5 Краткий обзор технологии Perl.............................................................31

1.5 Обзор использования WWW-технологий для доступа к базам данных.....321.5.1 Однократное или периодическое преобразование содержимого.. . .34БД в статические документы..........................................................................341.5.2 Динамическое создание гипертекстовых документов на основе содержимого БД.................................................................................................341.5.3 Создание информационного хранилища на основе высокопроизводительной СУБД с языком запросов SQL........................351.5.4 Обзор существующих СУБД...................................................................36

1.6 Постановка задачи............................................................................................392 РАЗРАБОТКА ИНФОРМАЦИОННОГО И ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ WEB-ПРИЛОЖЕНИЯ «АИС АПТЕКА»..................................41

2.1 Описание информационной системы.............................................................412.2 Структура информационной системы............................................................442.3 Описание программного инструментария разрабатывеамого web-приложения.............................................................................................................46

2.3.1 Обоснование выбора СУБД....................................................................462.3.2 Обзор СУБД MySQL................................................................................47

2.3.2.1 Основные возможности MySQL.........................................................482.3.2.2 Размеры таблицы в MySQL.................................................................51

2.3.3 Описание структуры таблиц разрабатываемого web-приложения522.3.4 Обзор технологии создания DHTML с использованием Perl...........572.3.5 Обзор библиотеки CGI.pm......................................................................592.3.6 Интерфейс Perl API для MySQL............................................................592.3.7 Обзор модуля mod_perl............................................................................61

6

Page 7: Аптека_ДИПЛОМ.doc

2.4 Описание программных модулей web-приложения «АИС Аптека»...........632.5 Входные данные...............................................................................................682.6 Выходные данные.............................................................................................68

3 ОПИСАНИЕ КОМПЛЕКСА ТЕХНИЧЕСКИХ СРЕДСТВ................................693.1 Обзор сетевых технологий..............................................................................693.2 Сетевые адаптеры.............................................................................................693.3 Сетевые кабели.................................................................................................703.4 Архитектура сети..............................................................................................713.5 Серверы и рабочие станции.............................................................................723.6 Распределенные (глобальные) сети................................................................743.7 Сети и модель OSI............................................................................................74

4 ЭКОНОМИЧЕСКАЯ ЭФФЕКТИВНОСТЬ ВНЕДРЕНИЯ СИСТЕМЫ...........774.1 Технико-экономическое обоснование эффективности проекта по разработке АИС «Аптека».....................................................................................774.2 Расчет экономической эффективности, внедрения системы принятия технико-экономических решений.........................................................................78

4.2.1 Расчет затрат на разработку и внедрение системы...........................784.2.2 Расчет затрат на разработку алгоритма..............................................784.2.3 Расчет затрат на написание и отладку программы...........................784.2.4 Расчет затрат, связанных с внедрением программы.........................804.2.5 Расчет затрат на комплекс технических средств...............................814.2.6 Расчет затрат на материалы...................................................................814.2.7 Расчет затрат на статью «Накладные расходы»................................814.2.8 Расчет затрат до внедрения программы..............................................824.2.9 Расчет затрат после внедрения программного обеспечения............824.2.10 Расчет экономии затрат от внедрения разработанной системы (программы)........................................................................................................83

5 ОХРАНА ТРУДА...................................................................................................855.1 Анализ производственных опасных и вредных факторов ВЦ.....................855.2 Защитные меры.................................................................................................86

5.2.1 Производственная санитария................................................................865.2.1.1. Производственный микроклимат......................................................865.2.1.2 Производственное освещение............................................................885.2.1.3 Защита от электромагнитного излучения в ВЦ.................................93

5.2.2 Электробезопасность в ВЦ..................................................................935.2.3 Пожарная безопасность ВЦ....................................................................95

ЗАКЛЮЧЕНИЕ.........................................................................................................96СПИСОК ЛИТЕРАТУРЫ.........................................................................................97Приложение А............................................................................................................98

7

Page 8: Аптека_ДИПЛОМ.doc

ВВЕДЕНИЕ

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

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

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

– отсутствие препарата в ближайших аптеках;– связь с аптеками по телефону, также не всегда приносит желаемого

результата, так как в данном случае большую роль играет человеческий фактор (неправильное восприятие звуковой информации);

– нехватка времени на проведение самостоятельного поиска.Для решения таких проблем существует Интернет. Средствами, которого

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

Целью данного дипломного проекта является создание web – приложения, предоставляющего подробную информацию о медицинских препаратах, то есть:

– название препарата;– страна производитель;– фирма производитель;– форма выпуска;

8

Page 9: Аптека_ДИПЛОМ.doc

– цена;– внешний вид упаковки;– информация об аптеке, в которой можно приобрести интересующий вас

препарат.Кроме того, будет создана возможность работы с оптовыми

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

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

9

Page 10: Аптека_ДИПЛОМ.doc

1 АНАЛИЗ СОВРЕМЕННОГО СОСТОЯНИЯ ВОПРОСОВ РАЗРАБОТКИ ИНТЕРАКТИВНЫХ WEB-ПРИЛОЖЕНИЙ

1.1 Обзор существующих web-ресурсов предоставляющих информацию о медицинских препаратах

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

Обзор web-сайта компании AlmerekДанный web-ресурс расположен в Интернете по адресу

http://www.almerek.kz, он представляет информацию о фармацевтической компании «Almerek». Данная компания занимается поставкой медицинских препаратов. Внешний вид html-страницы, предоставляющей информацию о компании представлен на рисунке 1.1.

Рисунок 1.1 - Внешний вид html-страницы, предоставляющей информацию о компании «Almerek»

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

Рисунок 1.2 - Внешний вид html-страницы, предоставляющей информацию о медицинских препаратах компании «Almerek»

10

Page 11: Аптека_ДИПЛОМ.doc

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

Web-ресурс компании «Almerek» имеет дружественный интерфейс. Также предоставлена достаточная информация о самой компании. На сайте имеется описание нескольких медицинских препаратов и оказываемые услуги компанией. Произведение поиска и заказов препаратов отсутствует.

Обзор web-сайта «www.pharmnews.kz» Данный web-ресурс имеет богатую информацию связанную с

фармацевтическим бизнесом в Казахстане. На данном сайте предоставлена следующая информация:

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

и информации связанной с ней. Данный web-ресурс имеет красивый и понятливый графический интерфейс. Внешний вид главной html-страницы представлен на рисунке 1.3.

Рисунок 1.3 - Внешний вид главной html-страницы сайта www.pharmnews.kz

Раздел «Новости» обновляется довольно часто, из него можно узнать очень многое о достижениях отечественной фармацевтики.

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

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

Обзор web-сайта «www.dari.kz»

11

Page 12: Аптека_ДИПЛОМ.doc

Сайт www.dari.kz - Республиканского государственного предприятия «Национальный центр экспертизы лекарственных средств, изделий медицинского назначения и медицинской техники» Министерства здравоохранения Республики Казахстан. Портал содержит огромное количество нормативных правовых актов и учетов. Обычным пользователям этот сайт будет не очень интересен, но для бизнесменов, связывающих свое дело с фармацевтикой, этот сайт - золотая жила информации. Внешний вид главной html-страницы сайта www.dari.kz представлен на следующей странице на рисунке 1.4.

Рисунок 1.4 - Внешний вид главной html-страницы сайта www.dari.kz

Обзор web-сайта «www.detki.kz»Интересный ресурс, посвященный женщинам, молодым семьям и

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

Рисунок 1.5 - Внешний вид главной html-страницы сайта www.detki.kz

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

12

Page 13: Аптека_ДИПЛОМ.doc

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

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

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

1.2 Законодательная основа Республики Казахстан “О лекарственных средствах”

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

Основные понятия, используемые в настоящем Законе В настоящем законе используются следующие понятия:1) аптечные организации – аптечные склады, аптеки, аптечные пункты,

аптечные киоски, а также склады медицинской техники, магазины медицинской техники и очковой оптики;

2) безопасность лекарственных средств – характеристика, степени риска причинения вреда здоровью;

3) Государственная Фармакопея Республики Казахстан – свод государственных стандартов качества и обязательных правил, которыми руководствуются при производстве, изготовлении, проверке качества, хранении и назначении больным лекарственных средств;

4) Государственный Реестр лекарственных средств Республики Казахстан - перечень лекарственных средств, зарегистрированных и разрешенных уполномоченным государственным органом к применению и производству в Республике Казахстан;

13

Page 14: Аптека_ДИПЛОМ.doc

5) Государственная регистрация лекарственных средств – установленная законом система одобрения, требуемая в качестве предварительного условия для введения лекарственных средств в обращение;

6) изделия медицинского назначения – перевязочный материал, медицинская техника, материалы и комплектующие к ним, очковая оптика, предметы протезно-ортопедического и санитарно–гигиенического назначения, используемые для диагностики, коррекции, реабилитации, изменения состояния и функции организма и лечения болезней;

7) качество лекарственных средств – соответствие лекарственных средств стандарту качества;

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

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

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

10) недоброкачественные лекарственные средства – лекарственные средства, не пригодные к применению вследствие несоответствия стандарту качества;

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

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

13) патентованные лекарственные средства – лекарственные средства, право на производство и продажу которых охраняется патентным законодательством Республики Казахстан;

14) субъекты обращения лекарственных средств – физические и юридические лица, осуществляющие обращение лекарственных средств на основании лицензии;

14

Page 15: Аптека_ДИПЛОМ.doc

15) фармацевтическая деятельность – деятельность, осуществляемая в процессе производства, изготовления, оптовой и розничной реализации лекарственных средств;

16) фальсифицированные лекарственные средства – незаконные копии лекарственных средств.

Государственное регулирование в сфере обращения лекарственных средств:

1. Государственное регулирование обращения лекарственных средств осуществляется путем:

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

средств;– контроля производства, изготовления и других видов оборота,

безопасности, эффективности, качества лекарственных средств.2. Регулирование обращения лекарственных средств осуществляют

Правительство Республики Казахстан и Центральный исполнительный орган Республики Казахстан, осуществляющий руководство в области охраны здоровья граждан (далее ЦИОЗ).

Сертификация лекарственных средств:1. Лекарственные средства подлежат обязательной сертификации.2. Сертификация лекарственных средств осуществляется в порядке,

установленном действующим законодательством Республики Казахстан.3. Сертификация лекарственных средств осуществляется

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

Хранение и уничтожение лекарственных средств:1. Лекарственные средства хранятся в условиях, обеспечивающих

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

2. Не допускается продление срока годности лекарственных средств.3. Порядок и правила переработки, уничтожения лекарственных средств,

не пригодных к реализации и употреблению, определяются ЦИОЗ.Оптовая реализация лекарственных средств: 1. Оптовая реализация лекарственных средств – деятельность, связанная с

закупом, хранением, импортом, экспортом лекарственных средств, за исключением реализации лекарственных средств населению.

2. Оптовая реализация лекарственных средств осуществляется через аптечные склады и склады медицинской техники, осуществляется в соответствии с Правилами оптовой реализации лекарственных средств, разработанными и утвержденными ЦИОЗ в установленном порядке.

15

Page 16: Аптека_ДИПЛОМ.doc

Реализация лекарственных средств осуществляется юридическими лицами, имеющими лицензию на оптовую реализацию.

Розничная реализация лекарственных средств:1. Розничная реализация лекарственных средств – деятельность,

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

2. Розничная реализация лекарственных средств осуществляется через аптеки, аптечные пункты, аптечные киоски, магазины медицинской техники и магазины очковой оптики в соответствии с правилами Надлежащей аптечной практики, разработанными и утвержденными ЦИОЗ в установленном порядке.

Реализация лекарственных средств осуществляется физическими и юридическими лицами, имеющими лицензию на розничную реализацию.

Требования к рекламе лекарственных средств:1. В средствах массовой информации допускается реклама лекарственных

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

фармакологическим данным о лекарственных средствах, полученным при клинических исследованиях.

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

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

5. При рекламе лекарственного средства не допускается его сравнение с другими лекарственными средствами в целях усиления рекламного эффекта.

6. Реклама не должна создавать впечатления ненужности медицинских консультаций или хирургических операций.

7. Реклама не должна содержать утверждений о том, что действие лекарственного средства гарантированно.

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

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

10. Запрещается реклама лекарственных средств отпускаемых по рецепту врача. [28]

1.3 Технологии создания web-приложений1.3.1 Обзор протокола HTTPHyperText Transfer Protocol (HTTP) - это протокол высокого уровня (а

именно, уровня приложений), обеспечивающий необходимую скорость передачи данных, требующуюся для распределенных информационных систем гипермедиа. HTTP используется проектом World Wide Web с 1990 года. [1]

16

Page 17: Аптека_ДИПЛОМ.doc

Практические информационные системы требуют большего, чем примитивный поиск, модификация и аннотация данных. HTTP/1.0 предоставляет открытое множество методов, которые могут быть использованы для указания целей запроса. Они построены на дисциплине ссылок, где для указания ресурса, к которому должен быть применен данный метод, используется Универсальный Идентификатор Ресурсов (Universal Resource Identifier - URI), в виде местонахождения (URL) или имени (URN). Формат сообщений сходен с форматом Internet Mail или Multipurpose Internet Mail Extensions (MIME-Многоцелевое Расширение Почты Internet)[1].

HTTP/1.0 используется также для коммуникаций между различными пользовательскими просмотрщиками и шлюзами, дающими гипермедиа доступ к существующим Internet протоколам, таким как SMTP, NNTP, FTP, Gopher и WAIS. HTTP/1.0 разработан, чтобы позволять таким шлюзам через proxy серверы, без какой-либо потери передавать данные с помощью упомянутых протоколов более ранних версий.

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

В Интернете коммуникации обычно основываются на TCP/IP протоколах. Для WWW номер порта по умолчанию – TCP 80, но также могут быть использованы и другие номера портов – это не исключает возможности использовать HTTP в качестве протокола верхнего уровня[1].

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

1.3.2 Обзор языка HTMLЧтобы представить информацию для глобального использования, нужен

универсальный язык, который понимали бы все компьютеры. Языком публикации, используемым в World Wide Web, является HTML (HyperText Markup Language - язык разметки гипертекстов).

17

Page 18: Аптека_ДИПЛОМ.doc

HTML дает авторам средства для: – публикации электронных документов с заголовками, текстом,

таблицами, списками, фотографиями; – загрузки электронной информации с помощью щелчка мыши на

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

для использования в поиске информации, резервировании, заказе продуктов; – включения электронных таблиц, видеоклипов, звуковых фрагментов и

других приложений непосредственно в документы[1]. Язык HTML был разработан Тимом Бернерс-Ли во время его работы в

CERN и распространен браузером Mosaic, разработанным в NCSA. В 1990-х годах он добился особенных успехов благодаря быстрому росту Web. В это время HTML был расширен и дополнен. В Web очень важно использование одних и тех же соглашений HTML авторами Web-страниц и производителями. Это явилось причиной совместной работы над спецификациями языка HTML.

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

В HTML 4.0 вводятся механизмы таблиц стилей, скриптов, кадров, внедрения объектов, улучшенная поддержка разных направлений письма и направления справа налево, таблицы с большим количеством возможностей и новые свойства форм, обеспечивая лучшие возможности доступа для людей с физическими недостатками[1].

Эта версия HTML разработана с помощью экспертов в области интернационализации, так что документы можно писать на любом языке и легко передавать их по всему миру. Это достигается за счет использования [RFC2070], относящегося к интернационализации HTML.

Важным шагом стало принятие стандарта ISO/IEC:10646 в качестве набора символов для документов HTML. Это наиболее содержательный стандарт в мире, в котором решены вопросы представления национальных символов, направления письма, пунктуации и других языковых вопросов.

Язык HTML разработан так, чтобы сделать Web-страницы более доступными для пользователей с физическими недостатками. В HTML 4.0 имеются следующие дополнения, продиктованные соображениями доступности:

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

– улучшены формы, включена возможность назначения клавиш доступа, возможность семантической группировки управляющих элементов формы, семантической группировки вариантов в тэге SELECT и активные метки;

– добавлена возможность разметки текстового описания включенного объекта (с помощью элемента OBJECT);

18

Page 19: Аптека_ДИПЛОМ.doc

– введен новый механизм действия изображений-карт на стороне клиента (элемент MAP), который позволяет авторам интегрировать изображения и текстовые ссылки;

– альтернативный текст для изображений, включаемых с помощью элемента IMG, обязателен;

– добавлена поддержка атрибутов title и lang во всех элементах; – добавлена поддержка элементов ABBR и ACRONYM;– более широкий диапазон целевых устройств (телетайп, шрифт Бройля и

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

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

1.3.3 Выполняемые сценарии JavaScript и VBScriptСтандартный язык разметки HTML позволяет легко и быстро создавать

Web-страницы, передаваемые по сети Интернет. Это достаточно удобный инструмент работы в сети, однако загружаемые в окно браузера страницы являются статичными. Пользователь не может изменять их содержимое, не может взаимодействовать с ними. Мы живем в динамичном, меняющемся мире, и, естественно, хотели бы видеть то же самое и в рукотворном, мире – мире Интернета[1].

Программы, написанные на этом языке, встраиваются в документ HTML и интерпретируется браузером, используемым для его просмотра. Подобная технология снимает нагрузку на сеть , избавляя пользователя от ненужных пересылок недостоверной информации, ибо теперь можно написать выполняемый на стороне клиента код для проверки введенных данных. Фирма Microsoft, браузер которой Internet Explorer фирмы Netscape, разработала и активно продвигает собственный язык сценариев – VBScript, являющийся подмножеством широко используемого для разработки Windows – приложений языка Visual Basic.

Языки сценариев действительно делают HTML – страницы интерактивными. Содержание страницы может зависеть от желания пользователя, однако для его изменения все равно необходимо производить загрузку новой страницы либо во фрейм отображаемой страницы, либо в новое окно браузера. Причем эти изменения связаны с необходимостью взаимодействия с элементами управления: кнопка, поле ввода, переключатель и т.п. Хотелось бы, чтобы страницы действительно стали динамичными, как наш меняющийся мир: за поворотом мы видим открывающийся новый вид, не взаимодействуя ни с какими «элементами управления». Двигаясь по странице и перемещая по ней курсор мыши, хочется увидеть новую информацию, скрытую до тех пор, пока курсор не пройдет, например, над определенным словом или изображением, расположенным на странице. Поместив курсор мыши на некоторый элемент списка, хотелось бы увидеть уточняющую информацию, скрытую для пользователя до этого момента. Или, указав просто на слово «дальше», увидеть на странице очередную картину любимого художника. Все

19

Page 20: Аптека_ДИПЛОМ.doc

это реализуется с помощью так называемого динамического языка разметки страниц (Dynamic HTML), который, по существу, состоит из трех компонентов – каскадной таблицы стилей (CSS), JavaScript и HTML, соединенных объектной моделью документа (DOM) [1].

Перечисленные технологии являются мощными инструментами создания интерактивных Web – страниц, однако они ограничены возможностями соответствующих языков сценариев, которые напрямую связаны с располагаемыми на странице элементами, задаваемыми тэгами языка HTML. Апплеты Java и элементы управления ActiveX, создаваемые с помощью современных языков программирования, поддерживающих объектно-ориентированные технологии, позволяют внедрять в документ программируемые объекты и взаимодействовать с ними, меняя их свойства и вызывая их методы посредством языков сценариев.

Язык создания сценариев JavaScriptЯзык программирования JavaScript разработан фирмой Netscape для

создания интерактивных HTML – документов. Это объектно-ориентированный язык разработки встраиваемых приложений, выполняющихся как на стороне клиента, так и на стороне сервера. Синтаксис языка очень похож на синтаксис языка Java – поэтому его часто называют Java – подобным. Клиентские приложения выполняются браузером просмотра Web – документов на машине пользователя, серверные приложения выполняются на сервере[1].

Языки Java и JavaScript являются разными языками, ориентированными на выполнение разных задач в сети, но дополняющими друг друга при создании сложных сетевых приложений.

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

Фирма Microsoft разработала свой интерпретатор языка JavaScript, который она называет Jscript.

20

Page 21: Аптека_ДИПЛОМ.doc

Рисунок 1.6 – Компоненты JavaScript

Основные области использования языка JavaScript при создании интерактивных HTML – страниц:

– динамическое создание документа с помощью сценария;– оперативная проверка достоверности заполняемых пользователем полей

форм HTML до передачи их на сервер;– создание динамических HTML – страниц совместно с каскадными

таблицами стилей и объектной моделью документа;– взаимодействие с пользователем при решении «локальных» задач,

решаемых приложением JavaScript, встроенном в HTML – страницу [1]. Язык VBScriptЯзык создания сценариев VBScript разработан фирмой Microsoft и

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

Преимуществом его применения для создания сценариев является возможность использования, с небольшими корректировки, ранее написанных процедур на языках Visual Basic и Visual Basic for Application.

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

VBScript используется для написания сценариев клиента (в этом случае браузер должен иметь встроенный интерпретатор этого языка), а также для написания сценариев на сервере (в этом случае сервер должен поддерживать язык VBScript). Для создания сценариев клиента используется набор объектов, аналогичных набору объектов JavaScript. Объекты клиенты и сервера отличаются друг от друга, но существует общая часть (ядро) объектов, используемых при разработке, как сценариев клиента, так и сценариев сервера [1].

21

Page 22: Аптека_ДИПЛОМ.doc

1.4 Обзор существующих методов создания DHTMLВ современном мире web-программирования существует огромное

количество технологии реализующих динамическое формирования HTML – страниц, которое в последствии получило название DHTML (Dynamic HTML) . Для разработки последних может быть использован любой язык программирования, поддерживающий операции со стандартными вводом и выводом. На ранней эпохе развития WWW (World Wide Web) разработчики часто использовали тот язык, который им больше всего приходился по вкусу. Однако, поддержка операции ввода/вывода, явилась недостаточным критерием при выборе языка программирования для web. Понимая, высокие темпы развития WWW, некоторые компании занимающиеся разработкой программного обеспечения начали создавать языки программирования, специализированные для работы с web. В результате последних разработок появились такие известные продукты, как PHP, ASP, JSP, PSP, Cold Fusion фирмы Allaire или пакет WOW (Web - Oracle - Web).

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

1.4.1 Обзор технологии CGI при создании интерактивных интерфейсов

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

– статический;– динамический.В первом случае источником интерфейса является HTML-документ,

созданный в каком-либо текстовом или HTML-ориентированном редакторе. Следовательно, данный документ остается неизменным в течение использования. Во втором случае источником интерфейса является HTML-документ сгенерированный cgi-модулем. Следовательно, появляется некоторая гибкость в видоизменении интерфейса во время использования[8].

Практически любая задача, решающая проблему получения данных от клиента, связана с построением интерфейса. Наиболее интересным является построение интерфейсов к различным базам данных, доступ к SQL-серверу, получение информации от периферийных устройств, создание клиентских рабочих мест. Все это возможно посредством CGI(Common Gateway Interface).

22

Page 23: Аптека_ДИПЛОМ.doc

Common Gateway Interface (CGI) является стандартом интерфейса внешней прикладной программы с WWW сервером.

Задача построения вышеназванных интерфейсов делится на две части: – клиентская часть;– серверная часть.

Рисунок 1.7 – Две части интерактивного интерфейса

Клиентская частьДля создания клиентской части необходимо создать HTML-документ, в

котором реализован интерфейс с пользователем. В языке HTML это возможно посредством форм.

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

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

Методы HTTP запросаДля реализации взаимодействия "клиент-сервер" важно, какой метод

HTTP запроса использует клиентская часть при обращении к WWW серверу. В общем случае, запрос - это сообщение, посылаемое клиентом серверу. Первая строка HTTP запроса включает в себя метод, который должен быть применен к запрашиваемому ресурсу, идентификатор ресурса(URI – Uniform Resource Identifier), и используемую версию HTTP-протокола. В рассматриваемом нами случае, клиентская часть применяет методы запроса POST и GET. Метод POST используется для запроса серверу, чтобы тот принял информацию, включенную в запрос, как относящуюся к ресурсу, указанному идентификатором ресурса. Метод GET используется для получения любой информации, идентифицированной идентификатором ресурса в HTTP запросе[8].

Спецификация CGICGI определяет 4 информационных потока. – переменные окружения;– стандартный входной поток; – стандартный выходной поток; – командная строка.

23

Page 24: Аптека_ДИПЛОМ.doc

Рисунок 1.8 – CGI-интерфейс

Переменные окруженияПеременные окружения условно делятся на два типа: – общие для всех типов запросов (устанавливаются для всех типов); – зависящие от метода запроса.К переменным первого типа относятся следующие переменные:SERVER_SOFTWARE содержит информацию о WWW сервере

(название/версия). SERVER_NAME содержит информацию об имени машины, на которой

запущен WWW сервер, символическое имя или IP адрес соответствующие URL.

GATEWAY_INERFACE содержит информацию о версии CGI(CGI/версия).

Следующие переменные являются специфичными для разных типов запросов и значения этим переменным присваиваются перед вызовом cgi-модуля.

CONTENT_LENGTH значение этой переменной соответствует длине стандартного входного потока в символах.

CONTENT_TYPE эта переменная специфицирована для запросов содержащих дополнительную информацию, таких как HTTP POST и PUT, и содержит тип данных этой информации.

SERVER_PROTOCOL эта переменная содержит информацию об имени и версии информационного протокола (протокол/версия).

SERVER_PORT значение переменной содержит номер порта, на который был послан запрос.

REQUEST_METHOD метод запроса, который был использован "POST","GET","HEAD" и т.д.

PATH_INFO значение переменной содержит полученный от клиента виртуальный путь до cgi-модуля

PATH_TRANSLATED значение переменной содержит физический путь до cgi-модуля, преобразованный из значения PATH_INFO.

24

Page 25: Аптека_ДИПЛОМ.doc

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

QUERY_STRING значение этой переменной соответствует строке символов следующей за знаком "?" в URL соответствующему данному запросу. Эта информация не декодируется сервером.

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

REMOTE_ADDRESS содержит IP адрес клиента.AUTH_TYPE если WWW-сервер поддерживает аутентификацию

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

REMOTE_USER содержит имя пользователя в случае аутотентификации. REMOTE_IDENT содержит имя пользователя, полученное от сервера

(если сервер поддерживает аутентификацию согласно RFC 931) HTTP_ACCEPT список типов MIME известных клиенту. Каждый тип в

списке должен быть отделен запятой согласно спецификации HTTP (тип/подтип,тип/подтип и т.д.)

HTTP_USER_AGENT название программы просмотра, которую использует клиент при посылке запроса.

Стандартный выводСGI - модуль выводит информацию в стандартный выходной поток. Этот

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

Заголовок выходного потока В некоторых случаях необходимо избегать обработки сервером вывода

cgi-модуля, и посылать клиенту данные без изменений. Для отличия таких cgi-модулей, CGI требует, чтобы их имена начинались на nph-. В этом случае формирование синтаксически правильного ответа клиенту cgi-модуль берет на себя[9].

1.4.2 Краткий обзор технологии PHP PHP появился как развитие другого продукта, PHP/FI. PHP/FI был создан

Rasmus'ом Lerdorf'ом в 1995 году, сначала как простой набор Perl-скриптов для отслеживания доступа к его собственному online-резюме. Он назвал этот набор скриптов 'Personal Contents Page Tools'. Поскольку требовалось б�ольшая функциональность, Rasmus написал расширенную реализацию C, которая могла работать с базами данных (БД), и дал пользователям возможность разрабатывать простые динамические[12].

PHP 3.0 была первой версией, похожей на сегодняшний PHP. Его создали Andi Gutmans и Zeev Suraski в 1997 году как полностью переписанный язык,

25

Page 26: Аптека_ДИПЛОМ.doc

поскольку они нашли его PHP/FI 2.0 недостаточно мощным для разработки их собственных eCommerce-приложений. С целью кооперации усилий, Andi, Rasmus и Zeev создали и выпустили PHP 3.0 как официальный преемник PHP/FI 2.0, и развитие PHP/FI 2.0 в основном остановилось.

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

Другой ключевой особенностью PHP 3.0 стала поддержка объектно-ориентированного синтаксиса и намного более мощный и цельный синтаксис языка. Язык был назван PHP: Hypertext Preprocessor.

В конце 1998 года PHP стал базой для десятков тысяч пользователей (ориентировочно) и сотен тысяч Web-сайтов. В момент пика своего успеха PHP 3.0 был установлен приблизительно на 10% Web-серверов Internet.

PHP 3.0 был официально выпущен в июне 1998 года после примерно 9 месяцев публичного тестирования.

Новая машина, 'Zend Engine' (по именам создателей - Zeev и Andi), успешно решила эти задачи и появилась сначала в середине 1999 года. PHP 4.0, основанный на этой машине и оснащённый большим количеством новых возможностей, был официально выпущен в мае 2000 года, спустя почти два года после своего предшественника, PHP 3.0. Помимо значительно возросшей производительности в этой новой версии, PHP 4.0 ввёл такие новые ключевые возможности, как поддержка большого количества Web-серверов, HTTP-сессий, буферизации вывода, более безопасные способы работы с пользовательским вводом и различные новые конструкции языка[12].

PHP 4 является в данный момент последней версией PHP. Уже началась работа по модификации и улучшению Zend Engine для её интеграции в PHP 5.0.Сегодня PHP используется сотнями тысяч разработчиков (ориентировочно), и несколько миллионов сайтов сообщают о его установке, что составляет свыше 20% доменов Internet.

Скрипты PHP применяются в трёх основных сферах.Серверный скриптинг. Это наиболее традиционная и главная сфера

применения PHP. Для выполнения этой работы вам нужны три вещи. Разборщик кода PHP (CGI или серверный модуль), web-сервер и web-браузер. Сервер должен быть запущен и должен иметь соединение с инсталированным PHP. Вы можете получить вывод PHP-программы в web-браузер, просматривая PHP-страницу на сервере. См. инструкции по установке.

Скриптинг командной строки. Вы можете создать и запустить PHP-скрипт на выполнение без сервера или браузера. Для этого необходим только разборщик PHP. Этот тип использования идеально подходит для регулярного выполнения скрипта с помощью cron (в *nix или Linux) или Task Scheduler (в Windows). Эти скрипты можно использовать также для задач простейшего текстового процессинга/обработки.

26

Page 27: Аптека_ДИПЛОМ.doc

Клиентские GUI-приложения. PHP, возможно, не самый лучший язык для написания оконных приложений, но, если вы знаете PHP очень хорошо и хотели бы использовать некоторые продвинутые возможности PHP в клиентских приложениях, вы можете также использовать PHP-GTK для создания таких программ. У вас имеется также возможность создавать межплатформенные приложения. PHP-GTK является расширением PHP, отсутствующим в основном дистрибутиве. Если вас интересует PHP-GTK, посетите его web-сайт.

В PHP вы не имеете ограничений в выводе HTML. PHP может выводить изображения, PDF-файлы и даже клипы Flash (используя libswf и Ming), генерируемые на лету. Вы также легко можете выводить любой текст, включая XHTML, и любой другой XML-файл. PHP может автоматически генерировать эти файлы и сохранять их в файловой системе, вместо их распечатки, формируя серверный кэш для вашего динамического содержимого.

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

В настоящее время поддерживаются следующие БД: Adabas D, dBase, Empress, FilePro(read-only), Hyperwave, IBM DB2, Informix, Ingres, InterBase, FrontBase, mSQL, Direct MS-SQL, MySQL, ODBC, Unix, Oracle (OCI7 и OCI8), Ovrimos, PostgreSQL, Solid, Sybase, Velocis, db.

1.4.3 Краткий обзор технологии ASPASP - это технология, позволяющая серверу исполнять определенную

последовательность действий, описываемых специальным скриптом (от англ. script - документ, сценарий.), в ответ на действия пользователя. Наиболее характерные действия пользователя - это переход по ссылке и заполнение и отправка формы. Ключевым отличием ASP от других скриптовых языков, например JavaScript, состоит в том, ASP указывает, что делать серверу, а JavaScript - браузеру. Вы можете не знать поддерживает ли браузер клиента JavaScript, если да, то какое его подмножество, разрешено ли использование JavaScript на пользовательской машине. Возможно, вам не хотелось бы, чтобы пользователь мог просматривать код вашего скрипта и знать, как он работает[1].

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

27

Page 28: Аптека_ДИПЛОМ.doc

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

Когда сервер получает от пользователя запрос на файл с расширением ASP, он сначала пропускает его через специальный фильтр, который просматривает файл на наличие тегов "<% : %>". Затем он выполняет команды указанные между ними и вставляет результаты их работы в тот файл, который получит пользователь, и который будет отображаться его браузером.

ASP дает следующие возможности:1. VBScript - очень простой язык. Вы можете начать писать свои скрипты

буквально с первого знакомства с ним. Простота языковых конструкций в сочетании с ограниченным набором минимально необходимых объектов позволяет разрабатывать динамические страницы очень быстро. Это действительно очень важно, учитывая, как быстро все меняется в цифровом мире. 2. Интеграция с ADO (ActiveX Data Objects - объекты доступа к данным ActiveX) позволяет соединяться с базами данных. Вы можете организовать систему заказов online, показывать клиентам актуальные остатки на складе, исполнение заказов, поддерживать сообщества посредством гостевых книг, форумов, чатов и пр. Вы не будете ограничены тем набором отчетов, который имеется у сайтов, предлагающих бесплатные счетчики. Например, мне не удавалось найти счетчик, который бы показывал среднее количество страниц,просмотренных пользователем за какой-то период. Если вы используете Microsoft Internet Information Server, то у вас есть возможность записывать протоколы обращений к веб-серверу в ODBC источник. Использование ADO дает возможность разрабатывать любую систему статистики посещения ваших ресурсов, выбирая данные из этого источника.

3. ASP поддерживает cookies (хранение информации на пользовательской машине), что дает возможность точно идентифицировать пользователя и предлагать ему информацию в соответствии с его настройками предпочтениями.

4. Тесная интеграция с ActiveX позволяет вам писать собственные (заказать на стороне) компоненты, написанные на языках, обеспечивающих более высокое быстродействие (Visual C++, Borland C++, Delphi, Visual Basic).

5. Microsoft предлагает визуальную среду быстрой разработки решений, построенных на ASP - MS Visual InterDev, входящий в состав MS Visual Studio.

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

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

28

Page 29: Аптека_ДИПЛОМ.doc

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

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

Поскольку сценарии выполняются на сервере, а не на локальном компьютере, веб-сервер выполняет и всю необходимую работу по созданию веб-страниц, которые будут отправлены в обозреватель. Простое копирование серверных сценариев невозможно, поскольку в обозреватель передаются только результаты их выполнения. Пользователи могут просматривать веб-страницы, но не могут видеть текст сценария, с помощью которого эти страницы создавались[1].

В технологии ASP есть и свои недостатки: 1. ASP разработана Microsoft и входит в состав Microsoft IIS. Этот

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

2. ASP довольно требовательна к ресурсам сервера. Если у вас много посетителей, вам придется закупить соответствующее "железо".

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

1.4.4 Краткий обзор технологии JSP Java Server Pages представляет собой расширение технологии сервлетов

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

29

Page 30: Аптека_ДИПЛОМ.doc

Web-страницы, добавляя средства динамического отображения содержимое и новые возможности по обработке[8].

В дополнение к классам и интерфейсам для программирования сервлетов (из пакетов javax.servlet и javax.servlet.http), в пакетах javax.servlet.jsp и javax.servlet.jsp.target содержатся классы и интерфейсы, относящиеся к программированию Java Server Pages. Полное описание технологии Java Server Pages можно найти в спецификации Java Server Pages 1.1 по адресу: java.sun.com/products/jsp/download.html.

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

Во многом страницы Java Server Pages выглядят как стандартные XHTML или XML - документы. В действительности JSP-страницы обычно содержат разметку XHTML или XML. Такая разметка носит название данных с неизменной структурой (fixed template data) или текста с неизменной структурой. Наличие данных с неизменной структурой часто помогают программисту принять решение, какую технологию следует использовать: сервлеты или JSP. Программисты предпочитают использовать JSP, если большая часть посылаемого клиенту содержимого представляет собой данные с неизменной структурой, и лишь небольшая часть содержимого генерируется динамически с помощью кода Java. Программисты используют сервлеты, если только небольшая часть содержимого, посылаемого клиенту, представ-ляет собой данные с неизменной структурой. На самом деле некоторые сервлеты не генерируют какого-либо содержимого. Вместо этого они выполняют определенную задачу в интересах клиента, а затем вызывают другие сервлеты или JSP-страницы, чтобы выдать ответ. Заметим, что в большинстве случаев сервлеты и JSP являются взаимозаменяемыми. Подобно сервлетам, JSP-страницы обычно выполняются на Web-сервере. Сервер при этом часто называют контейнером JSP.

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

30

Page 31: Аптека_ДИПЛОМ.doc

последующие запросы к этой JSP-странице. Если при компиляции нового сервлета возникают ошибки, эти ошибки приводят к ошибкам на этапе трансляции. Контейнер JSP на этапе трансляции помещает операторы Java, которые реализуют ответ JSP-страницы, в метод _jspSeroice. Если сервлет компилируется без ошибок, контейнер JSP вызывает метод _jspService для обработки запроса. JSP-страница может обработать запрос непосредственно или же вызвать другие компоненты Web-приложения, чтобы содействовать обработке запроса. Любые ошибки, которые имеют место в процессе обработки запроса, называются ошибки на этапе запроса[8].

В целом механизм запрос/ответ и жизненный цикл для JSP-страниц и для сервлетов одинаков. JSP-страницы могут определять методы jsplnit и jspDestroy (схожие с методами init и destroy для сервлетов), которые вызываются, когда JSP-страница, соответственно, инициализируется и завершает свое действие. Программисты JSP-страниц могут определять эти методы с помощью объявлений JSP — составной части механизма создания сценариев JSP.

1.4.5 Краткий обзор технологии PerlPerl (Practical Extraction and Report Language) является переносимым,

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

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

Структура Perl очень напоминает структуру языка программирования С и на первый взгляд выглядит так же, как программа С. Все операторы С представлены в Perl, а управляющие структуры, такие как if или for, имеются на языке Perl в несколько измененном виде. Чего не достает в Perl, так это указателей, структур и типов, определяемых пользователем. Место языка С в программировании неоспоримо, но не следует думать, что С-программа всегда лучше, чем эквивалентная программа на языке Perl. Как и у всякого средства, у Perl и у С есть свои области применения, к которым они лучше всего приспособлены. Надо хорошо знать оба языка, чтобы представлять, когда предпочтительнее использование одного из них.

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

– ассоциативные массивы, которые индексируются программами с использованием нецелых ключей;

31

Page 32: Аптека_ДИПЛОМ.doc

– автоматическое преобразование типов между целыми числами, числами с плавающей точкой и строками;

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

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

– функции вывода/ввода файлов;– функции форматированного вывода, наподобие функции С, с

добавлением к ним способности генерации отчетов на основе шаблонов (template);

– полный набор операторов С, с добавлением также операций по сравнению строк;

– функции для обработки списков, которые поддерживают стеки, очереди и другие данные списочных типов;

– функции системного сервиса.

1.5 Обзор использования WWW-технологий для доступа к базам данных

Многие организации используют электронные базы данных (БД) для поддержки своих рабочих процессов. Часто это системы на одного - двух пользователей, выполненные с использованием dbf - ориентированных средств разработки: Clipper, Dbase, FoxPro, Paradox, Access. Обычно используется ряд таких баз, независимых друг от друга. Если информация, хранимая в таких БД, представляет интерес не только для непосредственных пользователей, то для ее дальнейшего распространения используются бумажные отчеты и справки, созданные базой данных.

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

Из этих предпосылок возникает задача преобразования накопленных данных в гипертекстовые документы WWW, задача поддержки актуальности преобразованной структуры. Другими словами, задача предоставления WWW - доступа к существующим базам данных[4].

Использование технологий WWW для обеспечения доступа к каким-либо информационным ресурсам подразумевает существование следующих компонент (рисунок 1.9):

32

Page 33: Аптека_ДИПЛОМ.doc

– IP - сети с поддержкой базового набора услуг по передаче данных с единой политикой нумерации и маршрутизации, работающим сервисом имен DNS;

– выделенного информационного сервера – WWW-сервера, обеспечивающего предоставление гипертекстовых документов через IP - сеть в ответ на запросы WWW - клиентов.

Рисунок 1.9 – Использование технологий WWW для обеспечения доступа к каким-либо информационным ресурсам

Передаваемые гипертекстовые документы оформляются в стандарте HTML - языке описания гипертекстовых документов. Эти документы могут либо храниться в статическом виде (совокупность файлов на диске), либо динамически компоноваться в зависимости от параметров запроса специальным программным обеспечением. Для динамической компоновки HTML-документов, WWW-сервер использует специальным образом оформленные программы – CGI-программы.

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

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

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

33

Page 34: Аптека_ДИПЛОМ.doc

1.5.1 Однократное или периодическое преобразование содержимого БД в статические документы

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

Рисунок 1.10

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

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

1.5.2 Динамическое создание гипертекстовых документов на основе содержимого БД

В этом варианте доступ к БД осуществляется специальной CGI-программой, запускаемой WWW-сервером в ответ на запрос WWW - клиента. Эта программа, обрабатывая запрос, просматривает содержимое БД и создает выходной HTML-документ, возвращаемый клиенту (рисунок 1.11).

Рисунок 1.11

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

34

Page 35: Аптека_ДИПЛОМ.doc

этом варианте возможно осуществлять изменение БД из WWW-интерфейсов. [6]

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

Для реализации такой технологии необходимо использовать взаимодействие WWW-сервера с запускаемыми программами CGI - Common Gateway Interface. Выбор программных средств достаточно широк - языки программирования, интегрированные средства типа генераторов отчетов. Для СУБД с внутренними языками программирования существуют варианты использования этого языка для генерации документов.

1.5.3 Создание информационного хранилища на основе высокопроизводительной СУБД с языком запросов SQL

В этом варианте предлагается использование технологии, получившей название "информационного хранилища" (ИХ). Для обработки разнообразных запросов, в том числе и от WWW-сервера, используется промежуточная БД высокой производительности (рисунок 1.12). Информационное наполнение промежуточной БД осуществляется специализированным программным обеспечением на основе содержимого основных баз данных (рисунок 1.13).

– этап 1 - перегрузка данных;

Рисунок 1.12

– этап 2 - обработка запросов.

Рисунок 1.13

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

35

Page 36: Аптека_ДИПЛОМ.doc

на информационное хранилище, что существенно повысит надежность и производительность, позволит организовать распределенные рабочие места. [3]

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

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

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

1.5.4 Обзор существующих СУБДDB2DB2 имеет богатую, более чем 30-летнюю историю своего развития.В 1970 году в проекте E.Codd впервые был предпринят реляционный

подход для создания баз данных. С этого момента в лабораториях IBM начались исследования в области реляционных баз данных

В середине 70-ых годов была создана система System R. Она и определила архитектуру современных баз данных, в том числе использование языка запросов SQL. Основные принципы, заложенные тогда, присутствуют сейчас не только в DB2, но и в других современных СУБД . Это механизмы исполнения транзакций, механизмы конкурентного доступа к данным, архитектурное разделение системы на подсистемы разбора непроцедурных запросов и подсистему непосредственного доступа к данным, разнообразные методы оптимизации запросов, индексирования данных и увеличения производительности[22].

DB2 для мейнфреймов появилась в эпоху вычислительных центров и с самого своего появления была ориентирована на поддержку очень крупных централизованных систем, для которых главными требованиями являлись производительность и очень высокая надежность. Преемственность разработок явилась результатом того, что все эти качества присущи и современной СУБД на всех платформах (лидером надежности и производительности, безусловно, остается DB2 for OS/390). В настоящее время DB2 Universal Database может работать на следующих операционных системах: AIX, Linux, OS/2. Numa-Q, HP-UX, Sun, Windows, AS/400. OS/390.

Продуктами DB2 пользуются все сто крупнейших компаний мира и 80 процентов из числа пятисот наиболее крупных компаний.

Кратко основные преимущества DB2 в следующем: – поддержка фактически всех платформ; – проверенная производительность; – проверенное качество и надежность;

36

Page 37: Аптека_ДИПЛОМ.doc

– надежная защита информации; – низкая стоимость владения. SybaseСейчас уже никого не удивишь словами "клиент-серверная архитектура"

и "реляционные СУБД". Но в далекие восьмидесятые, когда аппаратные требования были не в пример более скромными, о возможностях построения распределенных вычислений и о выделенных серверах баз данных задумывались только самые смелые творческие умы. Но уже тогда реальные потребности финансовых учреждений в качественно новых средствах управления данными и высокие требования к надежности и сохранности данных требовали решения стоящих проблем. Так на свет появилась компания Sybase[23].

Ориентация на решение проблем, стоящих перед передовыми в смысле обработки данных отраслями, такими как финансовые и банковские системы, заставляла компанию не просто выпускать новые программные продукты, но и искать новые подходы. Введение таких понятий, как транзакция, многоуровневая архитектура, хранимые процедуры и триггеры - вот лишь некоторые новшества, которые впервые появились именно в продуктах компании Sybase. И, хотя список производителей ПО, занимающих первые строчки "табели о рангах", постоянно меняется, компания Sybase сохраняет свое присутствие среди крупнейших поставщиков СУБД, особо удерживая свою монополию на Уолл-Стрит: крупнейшие финансовые институты США используют СУБД именно этой компании.

Microsoft Access 2000СУБД Microsoft Access — наиболее широко используемая в среде

Microsoft Windows реляционная СУБД, Microsoft Access — типичная СУБД для персо-нальных компьютеров, обеспечивающая хранение, сортировку и поиск данных для множества приложений. В СУБД Access для создания таблиц, запросов, форм и отчетов предусмотрен графический интерфейс пользователя (Graphical User Interface — GUI); для разработки настраиваемых приложений с базой данных есть инструментальные средства, использующие макроязык Microsoft Access или язык VBA (Microsoft Visual Basic for Applications). Кроме того, в СУБД Access предусмотрены программы, называемые мастерами (Wizards), которые упрощают многие из процессов формирования приложений с базой данных, проводя пользователя через ряд диалоговых окон в запросно-ответном режиме. В СУБД Access предусмотрены также конструкторы (Builders), которые могут помочь пользователю сформировать синтаксически правильные выражения, например операторы и макрокоманды языка SQL. СУБД Access поддерживает значительную часть стандарта языка SQL, представленного в главах 5 и 6, а также стандарт Microsoft ODBC (Open Database Connectivity — открытый интерфейс доступа к базам данных), обеспечивающий общий интерфейс для доступа к раз-нотипным базам данных SQL, таким как Oracle и Informix.

37

Page 38: Аптека_ДИПЛОМ.doc

OracleКорпорация Oracle является лидером в поставке программного

обеспечения для управления информацией. Oracle является второй по величине в мире независимой компанией по производству программного обеспечения. С ежегодным доходом больше 10 миллиардов долларов компания предлагает свои базы данных, инструментальные средства и программные продукты наряду со связанными с ними услугами более чем в 145 странах мира. Oracle - самая успешно продающаяся многопользовательская реляционная СУБД. Примерно 80% из 400 самых состоятельных компаний используют решения Oracle для электронного бизнеса (e-Business) [24].Приложения Oracle Applications охватывают информационную поддержку процедур управления, электронную коммерцию (e-Commerce), поддержку валютного символа Евро, управление финансами (например, дебиторские и кредиторские счета и общую программу бухгалтерского учета), управление персоналом, закупку через Internet, производство, маркетинг, передвижения, проекты, сбыт, услуги, управление стратегией предприятия, цепь поставок, туристические услуги и казначейство.

MySQL ServerСУБД MySQL обладает многими преимуществами. Быстродействие. MySQL - достаточно быстродействующая СУБД.

Разработчики склоняются к мнению, что СУБД MySQL является одной из самых быстрых баз данных из имеющихся на современном рынке. В этом можно удостовериться, посетив Web-узел http://www.inysql.com/benchmark.html. Эта страница позволяет делать сравнительную проверку производительности на Web-узле MySQL[3].

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

Цена. СУБД MySQL распространяется бесплатно. Поддержка языка запросов. MySQL "понимает" команды языка SQL

(Structured Query Language - структурированный язык запросов). Этот язык применяется во всех современных СУБД. MySQL также поддерживает интерфейс ODBC (Open Database Connectivity), протокол интерфейса с базами данных, разработанный компанией Microsoft.

Возможности. Сервер позволяет одновременно подключаться неограниченному количеству пользователей. Доступ к серверу СУБД MySQL можно осуществить в интерактивном режиме с помощью различных интерфейсов, позволяющих вводить запросы и просматривать полученные результаты: это программы-клиенты, работающие с командной строкой, Web-броузеры или программы-клиенты, работающие в системе Х Window. Кроме того, в наличии имеются программные интерфейсы для таких языков, как С, Perl, Java, PHP и Python. Таким образом, можно использовать как готовое клиентское программное обеспечение, так и создавать свое собственное.

38

Page 39: Аптека_ДИПЛОМ.doc

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

Переносимость. СУБД MySQL отлично работает как под управлением самых различных версий UNIX, так и под управлением систем, не использующих UNIX, таких как Windows и OS/2. СУБД MySQL работает как на домашних ПК, так и на мощных серверах.

Открытое распространение. Дистрибуция СУБД MySQL легкодоступна. Для этого достаточно воспользоваться Web-броузером. Если вы не понимаете как что-либо работает, просмотрите исходный код. Если вам что-то в работе не нравится, можно внести коррективы[3].

1.6 Постановка задачиОдной из основных задач web-приложения, является предоставление

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

С учетом этого, должно быть разработано информационное web-приложение, решающие следующие задачи:

1. Сохранение информации о медицинских препаратах в базе данных;2. Проведение эффективного поиска медицинских препаратов по различным критериям;3. Вывод информации об имеющихся медицинских препаратах;4. Возможность корректировки и удаления информации о препаратах.;5. Регистрация оптовых покупателей;6. Проведение аутентификации оптовых покупателей;7. Проведение заказов на оптовую покупку медицинских препаратов;8. Сохранение информации о заказах в базе данных;9. Создание удобного и дружественного пользовательского интерфейса.Программный инструментарий системы должен соответсвовать

следующим требованиям:– СУБД должна быть быстрой и удовлетворять компанию по объему

хранимой информации;– язык серверных сценариев должен быть адаптирован на работу с

выбранной СУБД;– система администрирования web-узла должна быть относительно

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

экономической эффективности.

39

Page 40: Аптека_ДИПЛОМ.doc

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

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

40

Page 41: Аптека_ДИПЛОМ.doc

2 РАЗРАБОТКА ИНФОРМАЦИОННОГО И ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ WEB-ПРИЛОЖЕНИЯ «АИС АПТЕКА»

2.1 Описание информационной системыАптечные организации – аптечные склады, аптеки, аптечные пункты,

аптечные киоски, а также склады медицинской техники, магазины медицинской техники и очковой оптики.

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

Фармацевтическая компания – это компания, которая занимается производством, продажей и распространением медицинских препаратов, а также оборудованием, связанным с медициной.

Рассматриваемая компания в данном проекте занимается следующим:- доставкой медицинских препаратов, как отечественных, так и

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

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

Назначение компании, занимающейся фармацевтическим бизнесом, заключается в следующем:

- поставке медицинских препаратов; - хранение медицинских препаратов;- продажа медицинских препаратов;- проведение рекламной кампании медицинских препаратов. Компания, занимающаяся фармацевтическим бизнесом, состоит из

следующих отделов:- Отдел поставок. В обязанности данного отдела входит своевременная

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

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

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

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

41

Page 42: Аптека_ДИПЛОМ.doc

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

Всеми перечисленными отделами управляют два заместителя главного директора компании. Функциональная структура кампании представлена на следующей странице на рисунке 2.1.

42

Page 43: Аптека_ДИПЛОМ.doc

43

Page 44: Аптека_ДИПЛОМ.doc

2.2 Структура информационной системы

Функциональная структура web-приложения АИС «Аптека» состоит из следующих частей:

- клиентская часть;- административная часть.Клиентская часть web – приложения состоит из следующих подсистем:- система работы с препаратами;- система работы с аптеками;- система работы с оптовыми покупателями.Функциональная структура клиентской части представлена на рисунке

2.2.

Рисунок 2.2 – Функциональная структура клиентской части web – приложения АИС «Аптека»

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

44

Клиентская часть Web – приложение АИС «Аптека»

Система работы с препаратами

Подсистема поиска аптек

Подсистема поиска препаратов

Подсистема вывода информации о препаратах

Система работы с аптеками

Подсистема вывода информации об аптеках

Система работы с оптовыми покупателями

Подсистема регистрации оптовых покупателей

Подсистема аутентификации оптовых покупателей

Подсистема проведения оптовых заказов

Page 45: Аптека_ДИПЛОМ.doc

В свою очередь система работы с препаратами состоит из следующих подсистем:

- подсистема поиска препаратов;- подсистема вывода информации о препаратах.

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

на рисунке 2.3.

Рисунок 2.3 – Функциональная структура подсистемы поиска препаратов

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

Подсистема поиска аптек состоит из следующих частей:- поиск по номеру;- поиск по адресу;- поиск по телефону;- поиск по городу;Функциональная структура подсистемы поиска аптек представлена на

следующей странице рисунке 2.4.

45

Поиск по названию

Поиск по форме выпуска

Поиск по производителю(страна)

Поиск по фирме

Поиск по цене

Поиск по номеру аптеки

Подсистема поиска препаратов

Page 46: Аптека_ДИПЛОМ.doc

Рисунок 2.4 – Функциональная структура подсистемы поиска аптек

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

Система работы с оптовыми покупателями состоит из следующих подсистем:

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

предоставления дружественного графического доступа к информации хранящейся в базе данных кампании. Более подробное описание административной части web-приложения рассматривается в дипломной работе “Разработка web-приложения АИС Аптека (серверная часть) ” студента группы КСУ 01-4 Имашева А.А.

2.3 Описание программного инструментария разрабатывеамого web-приложения

2.3.1 Обоснование выбора СУБДСУБД, перечисленные в главе 1, являются надежными, мощными и

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

46

Поиск по названию

Поиск по номеру

Поиск по адресу

Поиск по телефону

Поиск по городу

Подсистема поиска аптек

Page 47: Аптека_ДИПЛОМ.doc

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

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

- реляционная СУБД;- клиент-серверная архитектура;- богатый набор типов данных;- гибкость в управлении;- надежность;- достаточно высокая защита информации;- возможность одновременной обработки нескольких запросов;- небольшой размер занимаемой программой памяти на ЭВМ;- возможность взаимодействия с Perl;- работа в ОС семейства Unix(Linux);- небольшая стоимость.На первый взгляд, можно сказать, что такой СУБД не существует, но не

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

2.3.2 Обзор СУБД MySQLРазработку и сопровождение MySQL, самой популярной SQL-базы

данных с открытым кодом, осуществляет компания MySQL AB. MySQL AB - коммерческая компания, основанная разработчиками MySQL, предоставляя различные сервисы для СУБД MySQL. [2]

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

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

47

Page 48: Аптека_ДИПЛОМ.doc

Программное обеспечение MySQL - это ПО с открытым кодом. ПО с открытым кодом означает, что применять и модифицировать его может любой желающий. Такое ПО можно получать по Internet и использовать бесплатно. При этом каждый пользователь может изучить исходный код и изменить его в соответствии со своими потребностями. Использование программного обеспечения MySQL регламентируется лицензией GPL (GNU General Public License), http://www.gnu.org/licenses/, в которой указано, что можно и чего нельзя делать с этим программным обеспечением в различных ситуациях. Если работа в рамках GPL вас не устраивает или планируется встраивание MySQL-кода в коммерческое приложение, есть возможность купить коммерческую лицензированную версию у компании MySQL AB.

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

Технические возможности СУБД MySQL. Более детальную информацию по техническим возможностям MySQL можно получить в разделе section 6 Справочник по языку MySQL. ПО MySQL является системой клиент-сервер, которая содержит многопоточный SQL-сервер, обеспечивающий поддержку различных вычислительных машин баз данных, а также несколько различных клиентских программ и библиотек, средства администрирования и широкий спектр программных интерфейсов (API). Мы также поставляем сервер MySQL в виде многопоточной библиотеки, которую можно подключить к пользовательскому приложению и получить компактный, более быстрый и легкий в управлении продукт.[20]

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

2.3.2.1 Основные возможности MySQLНиже приведено описание важных характеристик программного

обеспечения MySQL. Внутренние характеристики и переносимость:- написан на C и C++. Протестирован на множестве различных

компиляторов;

48

Page 49: Аптека_ДИПЛОМ.doc

- работает на различных платформах; - для обеспечения переносимости используется GNU Automake,

Autoconf и Libtool; - API для C, C++, Eiffel, Java, Perl, PHP, Python, Ruby и Tcl; - полностью многопоточный с использованием потоков ядра. Это

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

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

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

однопроходного мультисоединения (one-sweep multi-join); - хеш-таблицы в памяти, используемые как временные таблицы; - SQL-функции реализованы при помощи хорошо оптимизированной

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

- MySQL- код протестирован с использованием Purify (коммерческий детектор утечки памяти), а также Valgrind, одного из GPL-инструментов (http://developer.kde.org/~sewardj/).[17]

Типы столбцов - большое количество: целочисленные со знаком/беззнаковые, длиной в

1, 2, 3, 4 и 8 байтов, FLOAT, DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP, YEAR, SET и ENUM;

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

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

Команды и функции - полная поддержка операторов и функций в SELECT- и WHERE- частях запросов. Например:

mysql> SELECT CONCAT(first_name, " ", last_name) ->FROM tbl_name ->WHERE income/dependents > 10000 AND age > 30;

- полная поддержка для операторов SQL GROUP BY и ORDER BY с выражениями SQL. Поддержка групповых функций (COUNT(), COUNT(DISTINCT ...), AVG(), STD(), SUM(), MAX() и MIN());

- поддержка LEFT OUTER JOIN и RIGHT OUTER JOIN с синтаксисом ANSI SQL и ODBC;

- разрешены псевдонимы для таблиц и столбцов в соответствии со стандартом SQL92;.

- DELETE, INSERT, REPLACE, and UPDATE возвращают число строк, которые были изменены. Вместо этого можно задать возвращение совпавших строк. Для этого следует установить флаг при соединении с сервером;

49

Page 50: Аптека_ДИПЛОМ.doc

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

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

Безопасность Система, основанная на привилегиях и паролях, за счет чего

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

Масштабируемость и ограничения - управляет очень большими базами данных. Компания MySQL AB.

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

- для каждой таблицы разрешается иметь до 32 индексов. Каждый индекс может содержать от 1 до 16 столбцов или частей столбцов. Максимальная ширина индекса 500 бит (это значение может быть изменено при компиляции MySQL). Для индекса может использоваться префикс поля CHAR или VARCHAR.

Установка соединений - клиенты могут соединяться с MySQL, используя сокеты TCP/IP,

сокеты Unix или именованные каналы (named pipes, под NT). - поддержка ODBC (Open-DataBase-Connectivity) для Win32

(с исходным кодом). Все функции ODBC 2.5 и многие другие. Например, для соединения с MySQL можно использовать MS Access;

Локализация - сервер может обеспечивать сообщения об ошибках для клиентов на

различных языках; - полная поддержка нескольких различных кодировок, включая ISO-

8859-1 (Latin1), немецкий, big5, ujis и многие другие. Например, скандинавские символы разрешены в именах таблиц и столбцов;

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

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

50

Page 51: Аптека_ДИПЛОМ.doc

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

Клиенты и инструментарий - включает myisamchk, очень быструю утилиту для проверки,

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

- все MySQL-программы можно запускать с опциями --help или -? для получения помощи. [17, 18]

2.3.2.2 Размеры таблицы в MySQLMySQL версии 3.22 имеет предел по размеру таблиц 4 Гб. В MySQL

версии 3.23, где используется новый тип таблиц, максимальный размер таблицы доведен до 8 миллионов терабайтов (2 ^ 63 байт).[21]

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

Таблица 2.1

Операционная система

Ограничения на размеры файла

32-разрядная Linux-Intel

2Гб, 4Гб и более, в зависимости от версии Linux

Linux-Alpha 8T (?)Solaris 2.5.1 2 Гб (с патчем возможно 4Гб)Solaris 2.6 4Гб (может быть изменено при помощи

указания флага)Solaris 2.7 Intel 4 Гб Solaris 2.7 UltraSPARC

512 Гб

В Linux 2.2 существует возможность создавать таблицы с размерами более 2 Гб, используя патч LFS для файловой системы ext2. Существуют также патчи, обеспечивающие поддержку больших файлов для ReiserFS в Linux 2.4.

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

По умолчанию MySQL-таблицы имеют максимальный размер около 4 Гб. Для любой таблицы можно проверить/определить ее максимальный размер с помощью команд SHOW TABLE STATUS или myisamchk -dv table_name.

Если необходимы таблицы большего размера, чем 4 Гб (и используемая операционная система “не возражает”), следует при создании такой таблицы задать параметры AVG_ROW_LENGTH и MAX_ROWS. Эти параметры можно задать и позже – с помощью ALTER TABLE.

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

51

Page 52: Аптека_ДИПЛОМ.doc

Обычно myisampack ужимает таблицу по крайней мере на 50%, поэтому в результате можно получить очень большие таблицы. [20]

Есть еще одна возможность обойти ограничения операционной системы на размеры файлов данных MyISAM, - это делается при помощи опции RAID.

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

2.3.3 Описание структуры таблиц разрабатываемого web-приложения

В базе данных «Аптека» была создана таблица «apteki», содержащая следующие поля: поле ключ, номер аптеки, адрес аптеки, телефон аптеки, место расположения аптеки и город в котором находится аптека. В таблице 2.2 описана структура данной таблицы, и свойства ее полей.

Таблица 2.2 – Структура таблицы «apteki»Имя поля Описание Тип поля

ID Ключевое поле, счетчикPRIMARY KEY

Integer(11)

nomer Номер аптекиI

nteger(40)

adres Адрес аптеки VarChar(10)

telefon Телефон аптеки Integer(10)

mapКарта (графическое

расположение аптеки) VarChar(10)

gorodГород, в котором

расположена аптека VarChar(15)

SQL запрос для создания таблицы “Apteki”CREATE TABLE apteki ( ID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, nomer INT(40), adres VARCHAR(10), telefon INT(10), map VARCHAR(40), gorod VARCHAR(15)

52

Page 53: Аптека_ДИПЛОМ.doc

);Также была создана таблица «city», содержащая информацию о городах, в

которых находятся аптеки компании. Даная таблица содержит поле названия города. В таблице 2.3 описана структура таблицы «city», и свойства ее полей.

Таблица 2.3 – Структура таблицы «city»

Имя поля Описание Тип поля

name Название города VarChar(20)

SQL запрос для создания таблицы “City”

CREATE TABLE city ( name VARCHAR(20));Таблица «forma» содержит информацию о форме выпуска медицинских

препаратов. Данная таблица содержит поле названия формы выпуска. В таблице 2.4 описана структура таблицы «forma», и свойства ее полей.

Таблица 2.4 – Структура таблицы «forma»

Имя поля Описание Тип поля

nazvanie Форма выпуска препарата VarChar(30)

SQL запрос для создания таблицы “forma”CREATE TABLE forma ( name VARCHAR(30));Таблица «preparati» содержит информацию о медицинских препаратах

имеющихся в компании. Таблица содержит следующие поля: поле счетчик, время внесения, серийный номер, название, форма выпуска, страна производитель, фирма производитель, номер аптеки, в котором имеется данный препарат, розничная цена, оптовая цена, внешний вид упаковки. В таблице 2.5 описана структура таблицы «forma», и свойства ее полей.

Таблица 2.5 – Структура таблицы «preparati»Имя поля Описание Тип поля

ID Ключевое поле, счетчик PRIMARY KEYInteger(11)

53

Page 54: Аптека_ДИПЛОМ.doc

Продолжение таблицы 2.5Имя поля Описание Тип поля

T Время внесения (обновления)

информации о аптеки

TIMESTAMP

Serial Серийный номер препарата

VarChar(30)

Name Название препарата VarChar(50)

Forma Форма выпуска препарата

VarChar(20)

Proizvod Производитель препарата (страна)

VarChar(20)

Firma Фирма производитель препарата

VarChar(20)

Nomer_apteki Номера аптек, в которых имеется данный

препарат

VarChar(50)

Tsena Цена препарата (розничная)

VarChar(10)

Opt_tsena Цена препарата (оптовая) VarChar(10)

Kartinka Внешний вид упаковки VarChar(50)

SQL запрос для создания таблицы “Preparati”CREATE TABLE apteki ( ID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, t TIMESTAMP , serial VARCHAR(30), name VARCHAR(50), forma VARCHAR(20),

54

Page 55: Аптека_ДИПЛОМ.doc

proizvod VARCHAR(20), firma VARCHAR(20),nomer_aptek VARCHAR(50),tsena VARCHAR(10),opy_tsena VARCHAR(10),kartinka VARCHAR(40));Таблица «zakaz» содержит информацию о заказах на медицинские

препараты имеющихся в компании. Таблица содержит следующие поля: поле счетчик, время внесения, логин заказчика, ID заказанных препаратов, количество заказанных препаратов. В таблице 2.6 описана структура таблицы «zakaz», и свойства ее полей.

Таблица 2.6 – Структура таблицы «zakaz»

Имя поля Описание Тип поля

ID Ключевое поле, счетчикPRIMARY KEY

Integer(11)

tВремя внесения

(обновления) информации о аптеки

TIMESTAMP

Login Логин заказчика VarChar(10)

Preparati ID заказанных препаратов

VarChar(10)

Kolich Количество заказанных препаратов

VarChar(50)

SQL запрос для создания таблицы “Zakaz”CREATE TABLE zakaz ( ID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, t TIMESTAMP , login VARCHAR(10), preparati VARCHAR(10), kolich VARCHAR(50) );Таблица «user» содержит информацию о зарегистрированных клиентах

компании. Таблица содержит следующие поля: поле счетчик, время регистрации, логин клиента, имя клиента, фамилия клиента, организация клиента, e-mail клиента, телефон клиента и пароль клиента. В таблице 2.7 описана структура таблицы «user», и свойства ее полей.

55

Page 56: Аптека_ДИПЛОМ.doc

Таблица 2.7 – Структура таблицы «user»

Имя поля Описание Тип поля

ID Ключевое поле, счетчикPRIMARY KEY

Integer(11)

T Время регистрации TIMESTAMP

Login Логин заказчика VarChar(10)

Name Имя заказчика VarChar(10)

Famil Фамилия заказчика VarChar(10)

Organization Организация заказчика VarChar(20)

e_mail e-mail заказчика VarChar(20)

Telefon Телефон заказчика VarChar(15)

Passw Пароль заказчика VarChar(5)

SQL запрос для создания таблицы “User”CREATE TABLE user ( ID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, t TIMESTAMP , login VARCHAR(10), name VARCHAR(10), famil VARCHAR(10), organization VARCHAR(20), e_mail VARCHAR(20), telefon VARCHAR(15), passw VARCHAR(5) );

56

Page 57: Аптека_ДИПЛОМ.doc

2.3.4 Обзор технологии создания DHTML с использованием PerlСлово Perl является аббревиатурой выражения Practical Extraction and

Report Language (практический язык извлечений и отчетов), хотя иногда его называют Pathologically Eclectic Rubbish Lister (патологически эклектичный мусорный листер). Не стоит спорить о том, какое из этих названий более правильное, потому что оба они принадлежат Ларри Уоллу, создателю и главному архитектору, распространителю и опекуну языка Perl. Ларри создал этот язык, когда пытался формировать отчеты из иерархии файлов системы оповещения об ошибках, похожей на Usenet-новости, а возможности применявшегося в то время обработчика потоков данных awk оказались исчерпанными. Будучи настоящим (то есть ленивым) программистом, Ларри решил вырвать данную проблему с корнем, применив для этого какой-нибудь универсальный инструмент, который он надеялся использовать и в дальнейшем. В результате появилась первая версия языка Perl. [7]

Повысилась переносимость. То, что когда-то было компактным языком, теперь сопровождается сотнями страниц документации, в состав которой входят десятки man-страниц, 600-страничный справочник серии Nutshell, материалы множества телеконференций Usenet с 200000 подписчиков.

Назначение языка Perl – помочь программисту в выполнении рутинных задач, которые для shell слишком трудны или плохо переносимы, а также чересчур заумны, одноразовы или сложны для кодирования на С или ином используемом в UNIX языке. [13]

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

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

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

57

Page 58: Аптека_ДИПЛОМ.doc

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

Программисты настолько увлеклись языком Perl, что, помимо UNIX- и UNIX-подобных систем, начали использовать его и в системах Amiga, Atari ST, системах семейства Macintosh, VMS, OS/2, даже MS-DOS и, наконец, в Windows NT и Windows 95. [16]

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

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

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

В отличие от большинства shell (но аналогично awk и sed), интерпретатор языка Perl перед выполнением программы полностью разбирает ее и компилирует в свой внутренний формат. Это значит, что после запуска программы вы никогда не получите сообщение о синтаксической ошибке и что пробельные символы и комментарии не замедляют ход выполнения программы. Такой метод обеспечивает быстрое выполнение операций языка Perl после запуска и является дополнительным стимулом к отказу от использования С в качестве служебного языка систем лишь на том основании, что С – транслируемый язык.

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

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

58

Page 59: Аптека_ДИПЛОМ.doc

Другими словами, он сочетает в себе лучшее из компилятора и интерпретатора. Конечно же, было бы просто здорово, если бы выполнялось какое-то кэширование компилированного объектного кода между вызовами, а то и его трансляция в "родной" машинный код. Рабочая версия такого компилятора фактически уже существует, и сейчас планируется, что она войдет в выпуск 5.005. О текущем состоянии дел можно узнать в сборнике FAQ, посвященном Perl. [6, 7, 14]

2.3.5 Обзор библиотеки CGI.pmНачиная с версии 5.004, в состав стандартного дистрибутива Perl

включается модуль CGI.pm, который все знает и все умеет.Этот модуль, который написал Линкольн Штейн, автор хорошо известной

книги «How to Setup and Maintain Your Web Site», превращает процедуру создания CGI-программ на Perl в легкую прогулку. Как и сам Perl, CGI.pm является платформо-независимым, поэтому его можно использовать практически с любой ОС, от UNIX и Linux до VMS, он работает даже в таких системах, как Windows и MacOS.

Если у вас инсталлирована одна из более ранних версии Perl (но как минимум 5.001) и вы еще не собрались переходить на новую, просто получите CGI.pm из CPAN.

Если CGI.pm уже инсталлирован у вас в системе, вы можете прочесть его полную документацию, воспользовавшись любым из способов, которые вы используете для чтения man-страниц Perl, например с помощью команд man(1) или perldoc(l) либо обратившись к HTML-варианту документации. Если ничего не получается, прочтите файл CGI.pm. Документация на модуль встроена в сам модуль, представленным в простом формате pod.

Разрабатывая CGI-программы, держите экземпляр man-страницы модуля CGI.pm под рукой. Она не только содержит описание функций этого модуля, но и загружается вместе со всевозможными примерами и советами. [8]

2.3.6 Интерфейс Perl API для MySQLDBI представляет собой общий интерфейс для многих баз данных. Это

означает, что можно написать скрипт, работающий со многими различными процессорами баз данных без изменения. При этом для каждого типа базы данных необходим определенный драйвер (DBD – это аббревиатура DataBase Driver). Для MySQL этот драйвер называется DBD::mysql. [13]

Интерфейс DBI имеет унифицированные методы для работы с базами данных, информация о них представлена таблице 2.8.

Таблица 2.8 – Унифицированные методы DBI

Метод Описаниеconnect Создает соединение с сервером disconnect Разрывает соединение с сервером prepare Готовит SQL-запрос к выполнению execute Выполняет приготовленный запрос

59

Page 60: Аптека_ДИПЛОМ.doc

Продолжение таблица 2.8Метод Описаниеdo Готовит и выполняет запрос quote Заключает в символы цитирования

строки или BLOB-значения, которые вы собираетесь внести

fetchrow_array Возвращает следующую запись как массив

fetchrow_arrayref Возвращает следующую запись как ссылку на массив

fetchrow_hashref Возвращает следующую запись как ссылку на хеш

fetchall_arrayref Возвращает всю информацию как массив массивов

finish Завершает выражение и освобождает системные ресурсы

rows Возвращает количество измененных/удаленных строк

data_sources Возвращает массив, список баз данных, доступных на сервере

ChopBlanks Определяет, будут ли методы fetchrow_ убирать начальные и оконечные пробелы

NUM_OF_PARAMS Количество символов-заполнителей в приготовленном выражении

NULLABLE

Возвращает ссылку на массив значений, которые определяют, могут ли столбцы содержать значения NULL. Возможные значения для каждого элемента массива: 0 или пустая строка, если столбец не может быть NULL, 1 – если может, и 2, если статус NULL для столбца неизвестен

trace Производит трассировку для отладки

Также интерфейс DBI имеет методы, определенные только для MySQL, они представлены в таблице 2.9.

Таблица 2.9 – Методы, определенные только для MySQL

Метод Описаниеinsrtid Значение AUTO_INCREMENT, которое было присвоено

последним is_blob Какие столбцы имеют тип BLOB is_key Какие столбцы являются ключами

60

Page 61: Аптека_ДИПЛОМ.doc

Продолжение таблицы 2.9Метод Описаниеis_num Какие столбцы имеют числовой тип is_pri_key Какие столбцы являются первичными

ключами is_not_null Столбцы, которые НЕ МОГУТ иметь

значение NULL. См. NULLABLE (Таблица 6.3.8)

length Максимально допустимые размеры содержимого столбцов

max_length Максимальные размеры столбцов, присутствующих в результате

NAME Имена столбцов NUM_OF_FIELDS Количество полей, возвращенных в

результате операции table Имена таблиц в результате type Типы всех столбцов

2.3.7 Обзор модуля mod_perlКогда сервер Apache получает запрос на считывание статического файла

HTML, он может непосредственно обработать такой запрос, открыв файл и переслав его через сеть клиенту. Подобная обработка тем не менее не подходит для программ наподобие Perl-сценария cgi-bin. Такие сценарии не обрабатываются сервером Apache самостоятельно. Вместо этого Apache запускает Perl как внешний процесс и впоследствии возвращает его результирующий метод клиенту. Подобная обработка позволяет в случае необходимости легко расширить возможности Apache, однако вызов внешней программы снижает производительность работы сервера и вызывает некоторую задержку в обработке запроса. Причем такая задержка присутствует постоянно, поскольку каждый раз при получении запроса сервер Apache запускает новый процесс Perl. [2]

Чтобы исключить необходимость обработки сценариев с помощью внешних процессов, можно добавить компонент обработки сценариев непосредственно в сервер Apache. Для внедрения интерпретатора Perl в Apache и предназначен модуль mod_perl. Именно благодаря ему сервер получает возможность самостоятельно обрабатывать сценарии Perl.

Такой подход имеет несколько преимуществ: - Apache может быстрее обрабатывать сценарии Perl, поскольку

отпадает необходимость в запуске отдельного внешнего процесса;- один процесс Apache может обслуживать запросы большого

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

61

Page 62: Аптека_ДИПЛОМ.doc

правило, его проверку, компиляцию во внутреннюю форму и выполнение сгенерированной формы. Когда Perl запускается как часть Apache, откомпилированный сценарий остается в памяти, готовый для последующего выполнения. Если сервер повторно получает запрос на выполнение этого сценария, компилировать повторно его уже не нужно);

- поскольку интерпретатор Perl не закрывается по завершении обработки сценария, как это происходит при работе Perl в качестве отдельного процесса, среда обработки запросов остается постоянной для разных сценариев. Это делает возможным некоторые вещи, не осуществимые при обработке запросов независимыми процессами Perl. Одна из них – поддерживание постоянных соединений с базой данных (соединения с сервером баз данных, которые могут совместно использоваться сценариями, что снижает загрузку сети за счет уменьшения количества процедур установления и завершения соединений.).Хотя, необходимо признать, не все так хорошо, как хотелось бы.

Использование модуля mod_perl имеет и свой недостатки: - процедура инсталляции и настройки сервера Apache усложняется;- среда обработки запросов остается постоянной для разных для разных

сценариев. (Кстати, этот пункт был включен в список преимуществ, но постоянность внутренней среды интерпретатора Perl может рассматриваться как проблема, если обработка какого-либо сценария приведет к сбою в ее работе.) Соответственно, требование к правильности сценариев становится еще более строгим;

- внедрение интерпретатора Perl в Apache приводит к увеличению объемов процессов httpd и занимаемой памяти. Возможно, это потребует внесения каких-либо изменений в конфигурацию;

- сценарий mod_perl всегда запускается под управлением идентификаторов пользователя и группы процесса httpd. Поэтому невозможно выполнить их с правами другого пользователя или группы, используя механизм suEXEC. При использовании отельных процессов Perl это возможно;

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

Преимущества, напротив, будут проявляться на протяжении длительного периода времени. В более быстрой обработке сценариев с mod_perl по сравнению с выполнением их как отдельных программ можно убедиться, работая с Apache. Степень повышения производительности может изменяться в зависимости от узла к узлу. Согласно информации, представленной в руководстве mod_perl Guide, разработчики отмечают ускорение обработки запросов в 2-20 раз. [2]

Перечислив основные преимущества и недостатки модуля mod_perl, следует сразу отметить, что его использование рекомендуется, но не является

62

Page 63: Аптека_ДИПЛОМ.doc

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

Модуль mod_perl – не единственный механизм повышения скорости выполнения сценариев Perl. Вместо него или в комбинации с эти модулем можно использовать также модули FastCGI и VelociGen. Более того, соответствующая настройка Apache позволит использовать модуль mod_perl для обработки одних сценариев и модуль FastCGI (или VelociGen ) – для других. Более подробную информацию об иных модулях можно узнать по адресам www.fastcgi.com и http:///www.velocigen.com.

2.4 Описание программных модулей web-приложения «АИС Аптека»Приложение «Аптека» состоит из двух следующих частей:1. клиентская часть;2. административная часть.Клиентская часть предназначена для представления информации о

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

Административная часть предназначена для работы с информацией хранящейся в базе данных компании, здесь можно добавлять, удалять, корректировать и производить расширенный поиск аптек, препаратов, клиентов и заказов. Описание программных модулей входящих в административную часть web-приложения, смотреть в дипломной работе “Разработка web-приложения АИС Аптека (серверная часть) ” студента группы КСУ 01-4 Имашева А.А.

В клиентскую часть входят следующие программные модули:- index.html – главная страница клиентской части приложения;- company.html – страница предоставляющая информацию о кампании;- left.html – страница расположенная в левом фрейме главной страницы

(index.html);- right.html – страница расположенная в правом фрейме главной

страницы (index.html);- up.html – страница расположенная в верхнем фрейме главной

страницы (index.html);- down.html – страница расположенная в нижнем фрейме главной

страницы (index.html);- poisk_apt_user.html – страница предоставляющая проведения поиска

информации об аптеках в клиентской части приложения;- poisk_user.html – страница, предоставляющая поиск информации о

медицинских препаратах в клиентской части приложения; - zakaz.html – страница, предоставляющая проведение заказов

клиентами;

63

Page 64: Аптека_ДИПЛОМ.doc

- reg_usr.pl – скрипт генерирующий html-страницу для регистрации клиентов кампании;

- show_aptek_user.pl – скрипт генерирующий html-страницу, предоставляющую возможность вывода информации об аптеках;

- poisk_aptek_user.pl – скрипт генерирующий html-страницу, которая предоставляет результат проведения поиска информации об аптеках;

- poisk_user.pl – скрипт генерирующий html-страницу, которая предоставляет результат проведения поиска информации о медицинских препаратов.

Навигационная схема клиентской части приложения представлена на рисунке 2.5

Рисунок 2.5 - Навигационная схема клиентской части приложения

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

Описание скрипта reg_user.plСкрипт reg_user.pl генерирует html-страницу, которая предоставляет

возможность пользователям пройти регистрацию. Сгенерированная html-страница содержит текстовые поля, которые необходимо заполнить и нажать кнопку «Send» (внешний вид генерируемой html-страницы представлен на

64

Index.html

Company.html

Show_apt_user.pl

Poisk_apt_user.html

Reg_user.pl

Zakaz.pl

Poisk_user.html

Company.htmlPoisk_apt_user.pl

Page 65: Аптека_ДИПЛОМ.doc

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

Рисунок 2.6 - Внешний вид html-страницы генерируемой скриптом reg_user.pl

Рисунок 2.7 - Внешний вид html-страницы генерируемой скриптом reg_user.pl после нажатия кнопки «Send»

Описание скрипта zakaz.plСкрипт zakaz.pl генерирует html-страницу, которая производит

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

65

Page 66: Аптека_ДИПЛОМ.doc

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

Рисунок 2.7 - Внешний вид html-страницы генерируемой скриптом zakaz.pl

Рисунок 2.8 - Внешний вид html-страницы генерируемой скриптом zakaz.pl после нажатия кнопки «Вход»

66

Page 67: Аптека_ДИПЛОМ.doc

Рисунок 2.9 - Внешний вид html-страницы предоставляющейинформацию о компании

Рисунок 2.10 - Внешний вид html-страницы предоставляющейинформацию об аптеках

Рисунок 2.11 - Внешний вид html-страницы предоставляющей выбор критериев для поиска информации об аптеках

67

Page 68: Аптека_ДИПЛОМ.doc

Рисунок 2.12 - Внешний вид html-страницы предоставляющей выбор критериев для поиска информации о медицинских препаратах

Рисунок 2.13 - Внешний вид html-страницы предоставляющейпоиск информации о медицинских препаратах

Описание скриптов входящих в административную часть web-приложения, смотреть в дипломной работе “Разработка web-приложения АИС Аптека (серверная часть) ” студента группы КСУ 01-4 Имашева А.А

2.5 Входные данные

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

2.6 Выходные данные

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

68

Page 69: Аптека_ДИПЛОМ.doc

3 ОПИСАНИЕ КОМПЛЕКСА ТЕХНИЧЕСКИХ СРЕДСТВ

3.1 Обзор сетевых технологийЛокальная сеть (ЛВС) представляет собой коммуникационную систему,

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

- сетевой адаптер; - кабель; - сетевая операционная система (сетевые программы). [26]

3.2 Сетевые адаптеры

Рисунок 3.1 – Сетевой адаптер

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

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

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

Конфигурация адаптераКаждый адаптер, устанавливаемый в компьютер, должен нормально

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

1. I/Obase;Базовый адрес ввода-вывода является "каналом", по которому адаптер

взаимодействует с другими компонентами компьютера. Каждое устройство должно использовать уникальный диапазон адресов ввода-вывода.

2. IRQ;

69

Page 70: Аптека_ДИПЛОМ.doc

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

3.3 Сетевые кабели

Рисунок 3.2 – Сетевой кабель

Кабель обеспечивает канал связи компьютера с остальными машинами сети. При установке кабелей нужно точно следовать спецификациям. Пренебрежение этим правилом может принести очень много неприятностей. Отметим разницу между кабелем и кабельным сегментом говоря о кабеле, будем всегда иметь в виду отрезок провода, соединяющего два узла сети; сегментом же будем называть весь комплект кабелей от одного конца сети до другого (между терминаторами). Терминаторы представляют собой резисторы, устанавливаемые на обоих концах сегмента для согласования волнового сопротивления кабеля. Сигнал, дошедший до конца сегмента, поглощается терминатором - это позволяет избавиться от паразитных отраженных сигналов в сети. Если терминаторы не устанавливать, отраженный от конца кабеля сигнал снова попадает в кабель - этот отраженный сигнал будет являться в данном случае помехой и может породить множество проблем вплоть до полной неработоспособности сети. [26]

Кабель на основе скрученных пар (витая пара, TP). Кабель содержит две или более пары проводов, скрученных один с

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

Рисунок 3.3 – Сетевой кабель основе скрученных пар (витая пара, TP)

Коаксиальный кабель Состоит из центрального проводника (сплошного или многожильного),

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

70

Page 71: Аптека_ДИПЛОМ.doc

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

Оптический кабель Состоит из одного или нескольких кварцевых волокон (иногда

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

3.4 Архитектура сетиСетевая архитектура сродни архитектуре строений. Архитектура здания

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

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

Существуют 3 основных типа сетевой топологии:1. Общая шина

Рисунок 3.4 – Общая шина

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

2. Звезда

Рисунок 3.5 – Звезда

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

71

Page 72: Аптека_ДИПЛОМ.doc

топологии является ее устойчивость к повреждениям кабеля - при обрыве перестает работать только один из узлов сети и поиск повреждения значительно упрощается. Недостатком является более высокая стоимость. [27]

3. Кольцо

Рисунок 3.6 – Кольцо

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

Спецификации IEEEКаждая сеть должна следовать определенным правилам (протоколам) при

передачи данных от одного компьютера к другому. Протокол определяет способ доступа узла к передающей среде (кабелю) и способ передачи информации от одного узла к другому. [25]

В настоящее время используется два типа протоколов доступа к среде: - передача маркера (token) используется в сетях IBM Token Ring и FDDI; - множественный доступ с детектированием несущей (CSMA)используется в сетях Ethernet. Протокол Ethernet был разработан в 1973 году компанией Xerox и развит

впоследствии ею совместно с Intel и Digital Equipment Corp. С тех пор этот протокол стал международным стандартом организации компьютерных сетей. Стандарт был документирован и развит институтом IEEE и получил известность как спецификация IEEE 802.3. IEEE представляет собой организацию Международного Комитета по Стандартам (ISO), ответственной за выработку сетевых стандартов.

3.5 Серверы и рабочие станцииСеть представляет собой не просто компьютеры, соединенные вместе

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

72

Page 73: Аптека_ДИПЛОМ.doc

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

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

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

С сетевыми ресурсами обычно связывают локальные имена (A-Z для дисков; LPTx, COMx - для портов).

Рисунок 3.7 – Сети с выделенными серверами и одноранговые сети

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

По сравнению с универсально одноранговой архитектурой сеть клиент-сервер более специализирована.

Сети с архитектурой клиент-сервер- специализированный компьютер (выделенный сервер) используется для

установки всех разделяемых ресурсов. Такое решение ускоряет доступ пользователей к централизованным ресурсам сети;

- сетевое администрирование проще за счет незначительного числа серверов в сети и их узкой специализации;

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

- при нарушении работы сервера сеть становится практически неработоспособной.

Одноранговые сети- сетевые приложения могут быть распределены по многочисленным

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

большего числа серверов и более развитых возможностей каждого сервера;

73

Page 74: Аптека_ДИПЛОМ.doc

- невыделенные серверы медленнее специализированных.

3.6 Распределенные (глобальные) сетиВ общем случае сети, расположенные в одном (или нескольких близко

расположенных) здании называется локальной (ЛВС). Сети, объединяющие компьютеры в разных зданиях, городах и странах, она называется распределенной (WAN -Wide Area Network). Распределенные сети очень большого масштаба (например, Internet, EUNET, Relcom, FIDO) часто называют глобальными [27]. Распределенные сети состоят из трех основных компонент:

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

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

независимо от того, находятся ли эти ЛВС в одном здании или связаны через распределенную сеть.

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

- объединяют идентичные ЛВС; - простое усиление сигналов.Мосты (Bridge) передают сообщения на основе записей в таблице

пересылки. - возможность фильтрации сетевого трафика; - сохраняет информацию о всех узлах; - соединяет идентичные или разные сети (например, Ethernet и Token

Ring).Маршрутизаторы (Router) обеспечивают выбор маршрута обмена

данными между узлами сети. - принимает решение о выборе "лучшего пути"; - дистанция обычно оценивается в интервалах (hop) - промежутках

между двумя соседними маршрутизаторами на пути от отправителя к получателю.

3.7 Сети и модель OSIПри огромном числе компаний, разрабатывающих и производящих

оборудование и программы для организации сетей вопрос стандартизации играет важнейшую роль. Нет ничего странного в организации сети LANtastic с использованием адаптеров Artisoft, 3Com, Intel и других фирм. Возможность работы такого разнородного оборудования в одной сети обеспечивает стандарт Ethernet, разработанный IEEE. Использование этого стандарта всеми производителями адаптеров и концентраторов позволяет им выпускать оборудование, способное взаимодействовать с программами и аппаратурой других фирм при работе в одной сети. [25]

74

Page 75: Аптека_ДИПЛОМ.doc

Часто на одном компьютере используются сетевые программы разных фирм, работающие одновременно. Например, компьютер с LANtastic может одновременно работать как клиент NetWare. Для обеспечения совместимости программ Международная Организация по Стандартизации (ISO - International Standards Organization) разработала модель сетевой архитектуры, получившую известность как OSI-модель. Модель Взаимодействия Открытых Систем (Open Systems Interconnect) описывает структуру сетевых уровней. Не все разработчики программ в точности следуют этой модели, однако она дает основы понимания способов взаимодействия сетевых компонент.

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

Уровень приложений (Application Layer). На этом уровне работают приложения, с которыми имеет дело

пользователь. Уникальность этого уровня заключается в том, что он не предоставляет своих услуг другим уровням модели. Примерами уровня приложений могут служить программы Lotus 1-2-3 или Edit (впрочем и многие другие).

Уровень представления (Presentation Layer) Обеспечивает возможность понимания уровнем приложений одного

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

Сеансовый уровень (Session Layer) Организует диалог между процессами на разных машинах, управляет

этим диалогом и прерывает его по окончании. Примером этого уровня может служить протокол NetBIOS.

Транспортный уровень (Transport Layer) Обеспечивает взаимодействие между приложениями и

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

Сетевой уровень (Network Layer) Обеспечивает соединение двух конечных систем, находящихся в разных

подсетях. На сетевом уровне работают маршрутизаторы. Уровень канала данных (Data-Link Layer) Обеспечивает надежную передачу данных через канал связи (физическое

соединение, кабель). Этот уровень обеспечивает физическую адресацию, уведомления об ошибках, порядок доставки кадров и управление потоком данных. Обычно функции этого уровня реализованы в сетевом адаптере (Network Interface Card - NIC). На этом уровне работают мосты.

Физический уровень (Physical Layer)

75

Page 76: Аптека_ДИПЛОМ.doc

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

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

на компьютере 1: 1. Сетевой уровень получает данные от транспортного уровня. 2. Сетевой уровень форматирует информацию в пакеты и передает их на

уровень канала данных.3. Уровень канала данных помещает пакеты в кадры (фреймы) и передает

последние на физический уровень. 4. Физический уровень передает информацию в канал передачи. на компьютере 2: 5. Физический уровень принимает сигналы из кабеля. 6. Физический уровень передает данные на уровень канала данных.7. Уровень канала данных разбирает полученные кадры и передает

извлеченные из них пакеты на сетевой уровень.8. Сетевой уровень обрабатывает полученные пакеты и передает

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

Рисунок 3.8 – Взаимодействие по протоколу OSI

76

Page 77: Аптека_ДИПЛОМ.doc

4 ЭКОНОМИЧЕСКАЯ ЭФФЕКТИВНОСТЬ ВНЕДРЕНИЯ СИСТЕМЫ

4.1 Технико-экономическое обоснование эффективности проекта по разработке АИС «Аптека»

В данном проекте предоставлена технико-экономическая обоснование разработки web- приложение АИС «Аптека».

Область применения разработанного программного приложения – АИС «Аптека», предоставляющая справочную информацию о фармацевтических препаратах.

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

аптеках;- отпадает необходимость ручной обработки информации о

содержащихся препаратах в аптеках;- снижение избыточности информации.Разработанная АИС «Аптека» предназначена автоматизировать не только

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

Данная система является web-ресурсом, который располагается на определенном web-сервере. Из-за частой нехватки вычислительной памяти ЭВМ, приложения работающие на последней не имеют графического интерфейса, в том числе и выбранная СУБД. Данный аспект вынуждает пользователей, не подготовленных к работе с командной строкой запоминать сложные и весьма объемные команды работы с СУБД. В связи с выше сказанным одной из целей разработанного приложения является создание дружественного графического интерфейса для управления базой данных АИС «Аптека». К возможностям разработанного приложения относится:

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

электронному хранению информации.Разработанная АИС удовлетворяет всем требованиям, поставленным

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

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

77

Page 78: Аптека_ДИПЛОМ.doc

4.2 Расчет экономической эффективности, внедрения системы принятия технико-экономических решений

4.2.1 Расчет затрат на разработку и внедрение системы Затраты на разработку и внедрение системы составляют [27]:

С =Сj , (4.1)

где Сj - стоимость по j-ой статье затрат, тыс. тенге; m - общее количество статей затрат в калькуляции.

4.2.2 Расчет затрат на разработку алгоритмаЗатраты на разработку алгоритма определяются:

Салг = ЗПразр * В + Отз/п, (4.2)

где ЗПразр - оклад разработчика-программиста (40000т/мес); В - время, затраченное на разработку алгоритма (1мес); Отз/п - отчисления на социальные нужды (30%).

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

Отз/п = 40 000*1=40000*0.3=12000.

Затраты на разработку алгоритма определяются путем суммирования заработной платы разработчика-программиста за время разработки алгоритма и отчисления на социальные нужды (30%).

Салг = 40 000*1+12000=52000.

4.2.3 Расчет затрат на написание и отладку программыЗатраты определяются по формуле [27]:

Сотл = Котл + Фз/п отл, (4.3)

гдеКотл – стоимость машинного времени, затраченного на отладку

программы;Фз/п отл – фонд заработной платы программиста на отладку и написание

программы.Фонд заработной платы программиста рассчитывается:

Фз/п отл = kм * ЗПразр + Отз/п , (4.4)

где kм – количество месяцев, потраченных на разработку;

78

Page 79: Аптека_ДИПЛОМ.doc

ЗПразр – оклад программиста (т/месяц); Отз/п – отчисления на социальные нужды (30%).

Отчисления на социальные нужды берутся в размере 30% от заработной платы программиста, за время разработки алгоритма(2 месяца) т.е:

Отз/п = 2*40 000*0.3=24000,

Фонд заработной платы программиста рассчитывается путем суммирования заработной платы программиста за время разработки алгоритма и отчисления на социальные нужды (30%).

Фз/п отл = 2*40 000+24000=104000.

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

Котл = k * d * q, (4.5)

где k – время работы на ПК в день; d – количество дней работы на ПК; q – стоимость часа машинного времени (т/час).

Время работы на ПК в день к=6 часов, количество дней работы на ПК d=23 дней.

Ниже приводится расчет одного часа машинного времени.Стоимость часа машинного времени определяется следующим образом:

q=S/T, (4.6)

где S-годовые издержки использования ПК, тенге; Т-количество часов использования ПК в год, ч. (при 24 часовом и 30 рабочих днях в месяц)

S=U +U +U +U , (4.7)

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

Затраты на ремонт берутся в размере 10% в год от стоимости оборудования (стоимость оборудования составляет 104 320 тенге) и составляют:

U = 104 320 *0.1=10432 (тенге),

Амортизационные отчисления отчисляются из расчета 25% в год от стоимости оборудования и составляют [27]:

79

Page 80: Аптека_ДИПЛОМ.doc

U = 104 320*0.25=26080 (тенге).Заработная плата программиста 40000 тенге в месяц, с учетом отчислений

на социальные нужды 30% заработная плата программиста в год будет составлять:

U = (40 000*12)+144800 = 624000 (тенге).

Стоимость потребляемой электроэнергии рассчитывается исходя из потребляемой мощности компьютера и стоимости киловатта. Потребляемая электроэнергия в час равна 0.4 кВт, стоимость 1 кВт равна 1.84 тенге за час. Учитывая, что количество часов использования ПК в месяц составляет 253,92 час (при 24 часовом рабочем дне и 30 рабочих днях в месяц), стоимость потребляемой электроэнергии в год будет составлять:

U = 1.84*720 *12 = 15897 (тенге).

По формуле (4.7) вычисляем общие затраты:

S=10432+26080+624000+15897=676409,Т = 24*30*12*0,8=6912,

q= = 97,86 тенге/час,

Котл = 6*46*97,86 =27009 (тенге),

Сотл = 27009+104000=191009 (тенге).

4.2.4 Расчет затрат, связанных с внедрением программыЗатраты на внедрение программы определяются следующим образом

[27]:

Свн = Квн + Фз/п вн , (4.8)

где Квн - стоимость машинного времени за время внедрения; Фз/п вн - фонд заработной платы программиста за время внедрения.

Стоимость машинного времени:

Квн = k * d * q, (4.9)

где k – время работы на ПК в день; d – количество дней работы на ПК; q – стоимость часа машинного времени (т/час).

Фонд заработной платы программиста определяется:

Фз/п вн = ЗПразр*d/D + Отз/п, (4.10)

80

Page 81: Аптека_ДИПЛОМ.doc

где ЗПразр – заработная плата программиста, занятого внедрением (т/месяц); d – количество дней работы на ПК; D – количество рабочих дней в месяц (23 дня); Отз/п – отчисления на социальные нужды (30%).

Квн =6*23*97,86 =13504,

Отз/п =40000* *0,3=10434,

Фз/п вн = 40000* + 10434 = 45216,

Свн = 13504+10434=23938.

4.2.5 Расчет затрат на комплекс технических средствСтоимость ПК Pentium IV составляет 815 долларов (по курсу 128 тенге за

доллар), то есть 104 320 тенге. Итого = 104 320 тенге. 4.2.6 Расчет затрат на материалыВ ходе разработки программного обеспечения были использованы

следующие материалы:- Flash Disk USB 2.0, 512 Mb стоимостью 3072 тенге [1];- стоимость канцелярских товаров составляет 300 тенге;Расходы на статью «Материалы» составляют 3372 тенге.

4.2.7 Расчет затрат на статью «Накладные расходы»Сметная стоимость разработки программного продукта, представлена в

таблице 4.1

Таблица 4.1 – Сметная стоимость затрат разработки программного обеспеченияНаименование статей затрат Всего по теме

(тыс. тенге)Заработная плата 149216Отчисления на социальное страхование 46434Комплекс технических средств 104320Материалы 3372Накладные расходы 1492Прочие расходы 40513Итого сметная стоимость 358776

Используя формулу (4.1) рассчитаем сметную стоимость затрат на разработку и внедрение программного обеспечения:

С=С +С +С +С , (4.11)

81

Page 82: Аптека_ДИПЛОМ.doc

С = 52000 + 191009 + 23938 + 104 320 = 371267.

4.2.8 Расчет затрат до внедрения программыЗатраты на решение задачи без использования программы

рассчитываются по формуле [27]:

Затр = ФЗПр + Отз/п , (4.12)

где ФЗПр - фонд заработной платы в год группы лиц, решающих данную задачу; Отз/п -отчисления на социальные нужды (30%).

Фонд заработной платы работников за год, учитывая расчет вручную, определяется по формуле:

ФЗПр = ЗПр * N * 12, (4.13)

где ЗПр – оклад работника, т/мес; N – количество работников.

Количество сотрудников – 3 человека, оклад одного работника составляет 30 000 тг.

ФЗПр = 30 000 * 4 * 12 = 1080000 тг.,Отз/п = 1080000 * 0.3 = 324000 тг.,Затр = 1080000 + 324000 = 1404000.

4.2.9 Расчет затрат после внедрения программного обеспеченияГодовые затраты машинного времени на решение задачи определяется:

Кмаш = K * q ,

где K – количество часов использования ПК в месяц; q – стоимость часа машинного времени (т/час).

Количество часов использования ПК в месяц при 24 часовом рабочем дне в течении одного месяца(30 дней) составляет:

К = 24 * 30 = 720.

Годовые затраты машинного времени на решение задачи определяется перемножением количества часов использования ПК в месяц на стоимость часа машинного времени (т/час):

Кмаш = 24 * 30 * 97,86 = 70459.

Годовой фонд заработной платы работников отдела исходя из (4.13) будет определяться следующим образом:

82

Page 83: Аптека_ДИПЛОМ.doc

ФЗ = ЗПр * N * 12. (4.14)

Оклад работника составляет 40 000 тенге в месяц, количество работников после внедрения программы составляет 1 человек.

ФЗ = 40000 * 1* 12 + 144000 = 624000.

Тогда отчисления на социальные нужды от оклада работника (30%) составляют:

Отз/п = 40000 * 0.30 * 1 * 12 = 144000 тг.

Суммарные затраты после внедрения системы определяются путем суммирования всех затрат:

Затр’ = Кмаш + Кпеч + ФЗ + Отз/п , (4.15)

Затр’ = 70459 + 624000 +144000 = 838459.

4.2.10 Расчет экономии затрат от внедрения разработанной системы (программы)

Экономия затрат от внедрения системы определяется [27]:

Э = Затр - Затр’, (4.16)

где Затр – затраты до внедрения системы; Затр’ – затраты после внедрения системы.

Э = 1404000 – 838459 = 565541.

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

Ток = С/ Э , (4.17)

где С – затраты на разработку и внедрение системы (программы), тенге;

Э – экономия затрат от внедрения системы, тг/год.

Ток = = 0.65.

Годовой экономический эффект составил:

Эфгод = Э – Ен * С , (4.18)

где Э - годовая экономия затрат;

83

Page 84: Аптека_ДИПЛОМ.doc

Ен - нормативный коэффициент эффективности капитальных вложений (0,32); С - затраты на разработку и внедрение системы.

Эфгод = 565541 – 0.32 * 371267 = 446735,56.

В данном разделе дипломного проекта было представлено технико-экономическое обоснование (ТЭО) по теме: АИС «Аптека».В ТЭО были рассмотрены следующие вопросы:

1) планирование разработки и расчет трудоемкости;2) расчет стоимости разработки;3) экономическая эффективность разработки.В ТЭО рассчитана стоимость разработки программного обеспечения с

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

На основе приведенных выше вычислений можно сказать о том, что внедрение разработанного в данном дипломном проекте программного продукта позволит получить экономический эффект, определяемый повышением производительности труда работников, а также сокращением времени обработки информации и значительным повышением точности ее обработки. В результате расчета затрат на создание данного программного продукта составили 358 776 тенге. Эти расходы окупаются за 0.65 года. Годовой экономический эффект составил 446 735,56 тенге в год, а готовый программный продукт позволяет нам экономить 565 541 тенге в год что говорит о целесообразности внедрения данной системы.

84

Page 85: Аптека_ДИПЛОМ.doc

5 ОХРАНА ТРУДА

5.1 Анализ производственных опасных и вредных факторов ВЦПри описании основных опасных и вредных факторов следует учесть, что

практическая реализация требований, изложенных в СанПиН № 1.01.004.01 «Гигиенические требования к организации и условиям работы с видеодисплейными машинами», должно способствовать улучшению условий труда, уменьшению утомительности труда, повышению работоспособности и сохранению здоровья работников ВЦ. Обязательно следует учесть то, что труд работников ВЦ (математика программистов, операторов ЭВМ, операторов ВДТ, инженерно-технических работников) сопровождается необходимостью активации внимания и других психических функции. При работе с компьютерной техникой, оператор подвергается воздействию ряда вредных, а иногда и опасных факторов. Рассмотрим наиболее характерные из них [30].

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

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

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

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

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

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

85

Page 86: Аптека_ДИПЛОМ.doc

труда, при которых влияние опасных и вредных факторов на работающих либо устранено совсем, либо находится в допустимых пределах[30].

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

- микроклиматические условия;- освещение помещений;- защита от шума и вибрации;- защита от электромагнитного излучения;- пожаробезопасность;- электробезопасность.

5.2 Защитные меры5.2.1 Производственная санитария 5.2.1.1. Производственный микроклиматОсобенно большое влияние на микроклимат оказывают источники

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

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

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

Период года

Параметры воздушной среды на постоянных рабочих местах

оптимальные допустимые

температура,Со

влаж-ность,%

скоростьдвижения,м/с

темпе-ратура, Со

влаж-ность,%

скоростьдвиже-ния,м/с

Холодный 20-25 40-60 0.2 18-22 не более 70

0.3

86

Page 87: Аптека_ДИПЛОМ.doc

Продолжение Таблицы 5.1

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

Для создания в помещениях подходящего микроклимата используются общеобменная искусственная вентиляция в сочетании с местной как искусственной, так и естественной. Общеобменная вентиляция используется для обеспечения в помещениях соответствующих микроклиматических параметров; местная - для охлаждения собственно ЭВМ [30].

В дипломном проекте предусмотрен расчет вентиляции в помещении . Скорость движения воздуха 4м/сек. По скорости 4м/сек и расходу 370

м^3/час стандартный диаметр D=180 мм. Уточним скорость движения воздуха: = Q/S = 370 / (3600 * 0.0254) = 4.04 м/сек,По диаметру и скорости находим потери давления

R = 1.26 Па/м,

Длина конфузора ищется по формуле:

l(k)=(b-D)/2tg(a/2)=(1400-180)/2=610мм, (5.1)

где b - наименьший размер входного отверстия, b=1400мм; а - угол сужения конфузора, а=90;

D - диаметр, D=180мм.Длина отвода равна: l(o)= * a * n * D/180=562,2мм, (5.2)

где а - угол отвода в градусах, n - отношение радиуса отвода к диаметру воздухопровода, n=2.Длина воздуховода будет равна:

l = 565 + 610 + 500 + 2700 = 4375мм 4,4м,

Коэффициент сопротивления конфузора равен:

Е(k)=0,19, так как угол отвода а=90, а l(k)/p>1,

Период года

Параметры воздушной среды на постоянных рабочих местах

оптимальные допустимыеТеплый 20-25 40-60 0.5 28 24-70

25-65 0.3

87

Page 88: Аптека_ДИПЛОМ.doc

Коэффициент сопротивления отвода Е(o)=0,15, так как R(o)=2D, и а=90, Подбор вентилятора и расчет мощности для его привода. Вентилятор

подбираем из характеристик с максимальным КПД по расходу а(b)=370м^3/час и давлению H(b).

H(b)=1,1*H(c)=1,1*98,7=108,57Па, (5.3)

В аудиторию через вентиляцию проходит чистый воздух, поэтому можно подобрать вентилятор общего назначения, а если он не подходит, то пылевой для а(b)=370 м^3/час и H(b)=109 Па. Можно применить вентилятор ВЦП-4 с n=700 об/мин и (b)=0,53.Мощность для привода вычисляем по формуле

N(b)=(370*109)/(3600*1000*0,53)=0,02кВт, (5.4)

Мощность двигателя

N(э)=(k*N(b))/((1)(2))=0,03 кВт, (5.5)

где (1) - КПД подшипников вентилятора (1)=0,97; (2) - КПД передачи (2)=0,96; k - коэффициент запаса, при N(b)<0,5 кВт, k=1,5.

Система отопления обеспечивает достаточное, постоянное и равномерное нагревание воздуха в помещениях в холодный период года, а также безопасность в отношении пожара и взрыва. Для этого используются водяные, воздушные и панельно-лучистые системы центрального отопления. Поэтому в помещениях для создания подходящего микроклимата установлены кондиционеры КТА - 8 ЭВМ и КТА - 1-25 ЭВМ, работающие на охлаждении. В холодное время года в зале работает система центрального отопления[30].

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

5.2.1.2 Производственное освещение Освещение в помещениях предусматривается смешанным (естественным

и искусственным). Естественное освещение в помещениях осуществлено в виде бокового

освещения. Величина коэффициента естественной освещенности (Кео) должна соответствовать нормативным уровням по СНиП РК 2-04-05-2002

88

Page 89: Аптека_ДИПЛОМ.doc

«Естественное и искусственное освещение». При выполнении работы категории высокой зрительной точности Кео должен быть не ниже 1,5%, при зрительной работе средней точности - не ниже 10%. Ориентация световых проемов для помещений с ЭВМ и видеотерминалами должна быть северной.

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

Искусственное освещение в помещениях осуществлено в виде комбинированной системы освещения с использованием люминесцентных источников света в светильниках общего освещения. В качестве источников общего освещения должны использоваться люминесцентные лампы типа ЛБ и ДРЛ с индексом цветопередачи не менее 70 (R70), в качестве светильников – установки с преимущественно отраженным или рассеянным светораспределением. Величина освещенности при искусственном освещении люминесцентными лампами должна быть в горизонтальной плоскости не ниже 300 лк – для системы общего освещения и не ниже 750 лк – для системы комбинированного освещения. Величина искусственной освещенности для выполнения работ высокой зрительной точности при одном общем освещении должна быть не ниже 200 лк, для выполнения работ средней зрительной точности уровни искусственной освещенности должны быть, соответственно, не ниже 300 и 200 лк.

При работе операторов и программистов с видеотерминалами уровни искусственной освещенности от светильников общего освещения должны составлять: при систематическом использовании дисплеев и работе в режиме диалога уровня освещенности в горизонтальной плоскости должны быть не ниже 200 лк и не ниже 400 лк при использовании ВДТ и одновременной работе с документацией, а также при вводе данных в ЭВМ [29].

Таблица 5.2 - Нормы освещенности по СниП 11-4 – 79 Помещение Высота от

пола, м.

Норма освещенности, Лк.

КП,%неболее

общая комбинированная

Дляэксплуатационногоперсонала ПЭВМ

1-0.8 400 750 15

Дляобслуживающегоперсонала ПЭВМ

1-0.8 400 750 15

Расчет естественного освещения.Исходные данные:- размер помещения: длина L=8 м, ширина В=7 м, высота Н=4 м;

89

Page 90: Аптека_ДИПЛОМ.doc

- разряд зрительной работы - 5;- характеристика зрительной работы - высокая точность;- наименьший объект различения - 3-5 мм;- контраст различения объекта с фоном малый;- окна начинаются с высоты 1 м над уровнем пола;- высота окон - 2,5 м;- световой пояс - 4 (Алматы);- четырех сторон затеняющих зданий нет;- в помещении расположены 3 ЭВМ и вспомогательные материалы;- оборудование расположено вдоль стен на расстоянии 1,5 м;- длина каждого стола, на котором расположено оборудование - 1,5 м;- длина проходов - 2 м.Так как город Алматы находится в 4 световом поясе и окна выходят на юг

и на север, то расчетное КЕО определяется по формуле:

ек=е4н*m*с,

(5.6)

где - е4н - значение КЕО для 4 пояса;

- m - коэффициент светового климата;- c - коэффициент солнечности.Выбираем е4

н =1; m =0,9; c=0,75;

е4н =1*0,9*0,75=0,675(%),

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

обеспечивающую нормированное освещение на рабочих местах:

100*S0/Sn=er*u0*kзд*kз/t0*r1, (5.7)

где - Sn - площадь пола помещения;- er - расчетное значение КЕО;- u0 - световая характеристика окон;- kзд - коэффициент запаса;- t0 - общий коэффициент светопропускания;

t0=t1*t2*t3*t4,

(5.8)

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

- kзд - коэффициент, учитывающий затемнение окон противостоящими зданиями..

90

Page 91: Аптека_ДИПЛОМ.doc

Sn=B*L=8*7=56;u0- из соотношения длины к глубине:8:2=4; k1=1+2,5; B/k1= 7/3,5=2; u0= 9,5В качестве светопропускающего материала используем стекло оконное

листовое двойное. Вид несущих поверхностей железобетонные арки:t1=0,8; t2=0,75; t3=0,8; t0=0,8*0,8*0,75= 0,48.

Средний коэффициент отражения: рср=0,5Принимаем двустороннее боковое освещение.Определяем r1:

r1 = 1/ В, В = 4 /7 =0,57, то r1 = 1,3 и коэффициент запаса = 1,2

S0=56*0,68*0,95*1,2/100*0,48*1,9= 6,9 м2,Так как предусматриваем двустороннее боковое освещение, то площадь

оконных проемов на одной стороне будет 7:2=3,5 м2.Так как высота оконных проемов 2,5 м, то следовательно длина их

составит 3,5:2,5=1,4 м.Таким образом площадь оконных проемов составит с каждой стороны 3,5

м2 (1,4 х 2,5). Далее рассчитаем искусственное освещение. Расчет искусственного

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

N=(Eнk3Sz)/(nФсв), (5.9)

где Eн - нормируемая минимальная освещенность, лк;k3 - коэффициент запаса, учитывающий запыление светильников и износ

источников света в процессе эксплуатации; для помещений ВЦ, освещаемых люминесцентными лампами, k3=1.4–1.5 при условии чистки светильников не реже 2 раз в год;

S - освещаемая площадь, м2;z - коэффициент затенения, равен 1.1–1.4; n - число рядов светильников, намечаемое до расчета в соответствии с

наивыгоднейшим соотношением =L/h; L – расстояние между рядами, h - высота подвеса; как правило =1.3–1.4;

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

91

Page 92: Аптека_ДИПЛОМ.doc

потолка, индекса помещения i=АВ/[h(A+B)], где А и В – длина и высота помещения, h – высота подвеса светильников над рабочей поверхностью, м;

- коэффициент затенения, принимается равным 0.8–0.9. Для освещения машинного зала ВЦ с размерами А=24 м, В=9 м и

высотой Н=3 м предусмотрены потолочные светильники типа УВЛН2 с четырьмя люминесцентными лампами типа ЛБ–40. Коэффициенты отражения светового потока от потолка, стен и пола соответственно п=60%, с=50%, пола=10%. Затенения рабочих мест нет. Определим необходимое число светильников при общем равномерном освещении.

Для машинных залов уровень рабочей поверхности над полом составляет 0,8 м. Тогда h=Н–0,8=2,2 м. У светильников УВЛН наивыгоднейшее отношение =1,4. Отсюда расстояние между рядами светильников принимаем L =h = 1,4 *2,2 3 м. Располагаем светильники вдоль длинной стороны помещения. Расстояние между стенами и крайними рядами светильников принимаем равным l(0,3…0,5)L. При ширине машинного зала В=9 м имеем число рядов светильников n=B/L=3. Для машинных залов установлена норма освещенности Ен=400 лк.

С учетом заданных п , с, пола при

i=АВ/[h(A+B)]=180/2,2*(20+9)=3.0, (5.10)

из справочных данных находим = 0,4. Номинальный световой поток лампы ЛБ–40 Фл=3120 лм, тогда световой

поток, излучаемый светильником, составит

Фсв=4Фл=4*3120=12480 лм,

Определяем необходимое число светильников в ряду:

N = (Eнk3Sz)/(nФсв), (5.11)

N = 400*1,5*216*1,1/3*12480*0,4*0,8= 4,7412шт.

При длине одного светильника типа УВЛН с лампами ЛБ-40 lсв=1,33 м их общая длина составит Nlсв=1,331216 м. Разрывы между светильниками

R=(A-Nсв)/(N-1)=(24-16)/11=0,73, (5.12)

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

5.2.1.3 Защита от электромагнитного излучения в ВЦПри систематическом облучении наблюдаются стойкие нервно-

психические заболевания, изменение кровяного давления, замедление пульса, трофические явления (выпадение волос, ломкость ногтей и т.п.) [29].

92

Page 93: Аптека_ДИПЛОМ.doc

В таблице 5.3 - приведена предельно допустимая напряженность электромагнитного поля.

Таблица 5.3 - Предельно допустимая напряженность электромагнитного поля.Частота НапряжениеЭлектромагнитная составляющая, В/м60кГц 503-30МГц 2030-50МГц 1050-300МГц 5Магнитная составляющая, А/м60-1,5МГц 530-50МГц 0,3

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

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

- расстояние до экрана монитора должно быть 50-70 см;использование защитного экрана;

- плоскость экрана должна быть расположена вертикально или с наклоном на работающего;

- угол зрения должен находиться в пределах 15-20 градусов для оптимального различия символов на экране.

5.2.2 Электробезопасность в ВЦУчитывая требования по технике безопасности и специфику

производимых работ, особое внимание должно быть уделено обеспечению электробезопасности. В связи с этим предусмотрены следующие технические средства защиты [6]:

- электрическая изоляция токоведущих частей;- защитное заземление - преднамеренное электрическое

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

- применение малого напряжения - для производственныхцелей используется напряжение 42В;

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

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

93

Page 94: Аптека_ДИПЛОМ.doc

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

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

Для внедрения проектируемой системы проведём исследование выбранного помещения (с параметрами: длина помещения=30м, ширина=25м, высота=3м, площадь=750м2, 2250м3) .Категория здания по молниезащите.

Интенсивность грозовой деятельности

I=10-20ч/год

В расчетах принимаем 20 ч/год.Среднегодовое число поражений молнией 1 км2 земной поверхности n=1;

N= ,

Поскольку N<1 то зону защиты молниеотвода принимаем БПредусматриваем молниезащиту в виде отдельно стоящего стержневого

молниеотвода. Расстояние от молниеотвода до ближайшей наружной стены здания L=4 м.

Rx .

Высота молниеотвода

,

Высота вершины конуса зоны молниезащиты м.

h0 = 0.92*h=0.92*25=23(м).

Радиус границы зоны молниезащиты на уровне высоты здания

r0=1.5*h=1.5*25=37.5(м).

94

Page 95: Аптека_ДИПЛОМ.doc

5.2.3 Пожарная безопасность ВЦСогласно СНиП РК 2.02-05-2002 «Пожарная безопасность зданий и

сооружений» для большинства помещений ВЦ установлена категория пожарной опасности В.

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

Подпольные пространства под съемными полами разделяют несгораемыми перегородками с пределом огнестойкости не менее 0.75 ч на отсеки площадью не более 250 м2, коммуникации через которые прокладывают в специальных обоймах с применением негорючих уплотняющих материалов.

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

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

Ширину эвакуационного выхода (двери) устанавливают в зависимости от общего количества людей, эвакуирующихся через этот выход, но не менее 0,8м.

95

Page 96: Аптека_ДИПЛОМ.doc

ЗАКЛЮЧЕНИЕ

В ходе выполнения дипломного проекта, было создано web – приложение «Аптека». Данное приложение предназначено для предоставления информации о медицинских препаратах и аптеках компании занимающейся фармацевтическим бизнесом, средствами современных web – технологий.

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

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

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

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

96

Page 97: Аптека_ДИПЛОМ.doc

СПИСОК ЛИТЕРАТУРЫ

1. Матросов А. HTML 4.0. – СПб.: БХВ-Петербург, 2001.2. Дюбуа Поль. Применение MySQL и Perl в Web-приложениях. – М.:

Вильямс, 2002.3. Пол Дюбуа. MySQL. – М.: Вильямс, 2001.4. Кузнецов М.В., Симдянов И.В. MySQL – СПб.: БХВ-Петербург, 2006. 5. Аткинсон Л. Администрирование MySQL. – М.: Вильямс, 2002.6. Васвани В. MySQL и ODBC. – М.: Вильямс, 2005. 7. Пэтчетт К., Райт М. Perl – Киев.: БХВ-Киев, 2000. 8. Каба М. Perl и CGI. – СПб.: Питер, 2001.9. Кастро Э. Web – программирование на Perl. – М.: Весь, 2003. 10. Водолазский В., Семериков В. Язык программирования Perl– СПб.:

Питер, 2002. 11. Холден Г. Web – сервер Apache. – М. : ДиаСофт, 2000. 12. http://citforum.ru/internet/php.shtml13. http://citforum.ru/internet/perl_tut/index.shtml14. http://citforum.ru/database/cnit/6.shtml15. http://citforum.ru/database/cnit/p2.shtml16. http://lib.ru/PERL/russperl5/17. http://citforum.ru/database/mysqld/developer_man.html18. http://citforum.ru/database/mysql/odbc.html19. http://citforum.ru/database/mysql/admin.html20. http://citforum.ru/database/mysql/intro.html21. http://citforum.ru/database/mysql/doc/index.html22. http://citfoum.ru/database/db2.shtml23. http://citforum.ru/database/sybase.shtml24. http://citforum.ru/database/oracle.shtml25. http://citforum.ru/net/lan.shtml26. http://citforum.ru/net/dummi.shtml

27. Хавронская А.М. Оценка технико-экономической эффективности программных средств. – Алматы: КазНТУ, 2002.

28. http://pharmnews.kz29. Закон РК “О промышленной безопасности на опасных

производственных объектов” : Алматы, 2003.30. Кондиционирование и вентиляция в помещении вычислительного

центра. Методическое указание к выполнению раздела “Охрана труда” в дипломном проекте : Алматы, 1980.

97

Page 98: Аптека_ДИПЛОМ.doc

Приложение А

Листинг программ

Код скрипта add_apteka.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $c=0;6. my $host="127.0.0.1";7. my $db_name="apteka";8. my @list;9. my @field_list =(10. { name => "nomer", label => "Номер:", size => 30, req => 1},11. { name => "adres", label => "Адрес:", size => 30, req => 1},12. { name => "telefon", label => "Телефон:", size => 30, req => 1},13. { name => "gorod", label => "Город:", size => 30, req => 1},14. { name => "map", label => "Карта:", size => 20, req => 1});15. #Procedure sozdania formi16. sub display_entry_form{17. my $field_ref = shift;18. my $st = shift;19. my $send = shift;20. my @row;21. print center;22. print p br, br, br, br;23. print p ($st);24. print p hr ({-width => '50%'});25. foreach my $f (@{$field_ref}) {26. my $label = $f->{label};27. $label .= "*" if $f->{req};28. if($f->{name} ne "gorod") {29. push (@row, Tr (td (escapeHTML($label), td (textfield (-name => $f->{name},-size => $f->{size})))));}30. else{31. push (@row, Tr ( td ({-align => "left"}, escapeHTML($label),td ({-align => "left"}, popup_menu(-name=>$f->{name}, -value=>\

@list)))));}}32. print table (@row), submit (-name => "choice", -value => $send)," ", reset();33. }34. #Процедура проверки данных вводимых в форму35. sub process_form {36. my $field_ref = shift;37. my (@errors);38. foreach my $f (@{$field_ref}){39. $c=0;40. my $value = param ($f->{name});41. $value = "" unless defined ($value);42. $value =~ s/^\s+//;43. $value =~ s/\s+$//;44. $f->{value} = $value;45. push (@errors, $f->{label}) if $value eq "" && $f->{req};}46. push (@errors, "Номер (поле должно содержать только цифры, например, 33)")47. if $c =(param("nomer") =~ tr/[a-z|A-Z|а-я|А-Я|(!@#$%^&*()_+=\|{})[];:№?*"|//) !=0;48. push (@errors, "Телефон (поле должно содержать только цифры, например, 77-77-77)")49. if $c =(param("telefon") =~ tr/[a-z|A-Z|а-я|А-Я|(!@#$%^&*()_+=\|{})[];:№?*"|//) !=0;50. if (param("gorod") eq "Выберите город"){51. push (@errors, "Вы не выбрали город");}52. if (@errors){53. display_entry_form ($field_ref,"","Отправить");54. print p ("</center> Некоторые данные отсутствуют, или содержат ошибки.\n" .55. " Пожалуйста, заполните(исправьте) следующие поля: ");56. s/:// foreach (@errors);57. print ul (li(\@errors));58. return;}59. else{60. print br, br,br,br, center;61. my $sql = "";62. foreach my $f (@{$field_ref}){63. my $label = $f->{label};64. my $name = $f->{name};65. my $value = param($f->{name});66. if ($name eq "map"){67. $value = "/img/" . $value . ".jpg";}68. print p h4 $label ." " . "<font color=red>" .

98

Page 99: Аптека_ДИПЛОМ.doc

Продолжение приложения А

69. escapeHTML(param($f->{name})) ."</font>";70. $sql .= "," if $sql;71. $sql .= " $name= " . "'".$value."'" ;}72. print p hr ({-width => '50%'});73. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});74. my $nom = param('nomer');75. my $city = param('gorod');76. my $sth = $dbh->prepare("SELECT nomer FROM apteki WHERE gorod='$city' AND nomer =$nom");77. $sth->execute();78. my $ref = $sth->fetchrow_arrayref;79. $sth->finish();80. if ($ref->[0] eq ""){81. my $s = "INSERT INTO apteki SET " . $sql;82. my $rows = $dbh->do($s);83. $dbh->disconnect;84. if ($rows){85. print p center "Ваши данные были занесены в базу данных";}86. else{87. print p center b "Ваши данные не были занесены в базу данных, обратитесь к администратору";}}88. else {89. print p "Аптека №$nom уже существует в городе $city";90. print p "Данные не были занесены в базу данных";}}}91. my $stmt = "Пожалуйста, введите информацию\n" . " и щелкните на кнопке ". strong("Отправить" . " ") . "(Символом '*' отмечены

обязательные\n" . " для заполнения поля.)\n";92. print header(-charset=>'Windows-1251');93. print start_html (-title => "Аптека", -bgcolor=>'wheat');94. print start_form(-action => url ());95. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});96. @list = @{$dbh->selectcol_arrayref("SELECT name FROM city")};97. unshift(@list,"Выберите город");98. my $choice = param("choice");99. if ($choice eq ""){100. my $send = "Отправить";101. display_entry_form (\@field_list,$stmt,$send);}102. elsif ($choice eq "Отправить"){103. process_form(\@field_list);}104. else{105. print p (escapeHTML("Логическая ошибка, "106. . "неправильный выбор: $choice"));}107. print end_form(), end_html();108. exit(0);

Код скрипта add_city.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my @row;8. my $send = 'Ввести в базу данных';9. my $label = 'Ведите название города';10. print header(-charset=>'Windows-1251');11. print start_html (-title => "Аптека", -bgcolor=>'wheat');12. print start_form(-action => url ());13. my $choice = param("choice");14. if ($choice eq ""){15. print p br, br, br, br;16. print p center h2 "Внесение нового города в базу данных";17. print p hr ({-width => '50%'});18. print p br, br;19. push (@row, Tr (td (escapeHTML($label), td (), td (textfield (-name => 'gorod', -size => '30')), td (), td (submit (-name => "choice", -value

=> $send)))));20. print center table (@row);}21. elsif ($choice eq $send){22. my $city = param("gorod");23. my $c =($city =~ tr/[0-9]|[(!@#$%^&*()_+=\|{})[];:№?*"]//);24. if (($city eq "") || ($c != 0)){25. print br, br, br, br, br, br; 26. print center font({-color => 'red', -size=>'5'}, "Ошибка при вводе информации") ;27. print br;28. print center font({-color => 'red', -size=>'4'}, "Вы допустили одну из следующих ошибок:");29. print br;30. print center font({-color => 'red', -size=>'4'}, "Забыли ввести название города");

99

Page 100: Аптека_ДИПЛОМ.doc

Продолжение приложения А

31. print center font({-color => 'red', -size=>'4'}, "Ввели некорректное название города");32. print br;33. print center "<A href='../cgi-bin/add_city.pl' target='down'>Попробуйте снова</A>";}34. else{35. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});36. my $sth = $dbh->prepare("SELECT name FROM city WHERE name='$city'");37. $sth->execute();38. my $ref = $sth->fetchrow_arrayref;39. $sth->finish();40. if ($ref->[0] eq ""){41. my $stmt = "INSERT INTO city SET name='$city'";42. my $rows = $dbh->do($stmt);43. if ($rows){44. print br, br, br, br, br, br;45. print p center h3 ("Благодарим вас за введенную информацию");}46. else{47. print br, br, br, br, br, br;48. print p center h3 ("К сожалению, обработать вашу информацию не 49. удалось.\n" . "Пожалуйста, попробуйте ввести ее повторно позже");}}50. else{51. print br, br, br, br, br, br;52. print center font({-color => 'red', -size=>'4'}, "Введеный вами город уже имеется в базе данных"); 53. print br;54. print center "<A href='../cgi-bin/add_city.pl' target='down'>Попробуйте снова</A>";}55. $dbh->disconnect;}}56. else{57. print p (escapeHTML("Логическая ошибка, " . "неправильный выбор: $choice"));}58. print end_form();59. print end_html();60. exit(0);

Код скрипта add_prepar.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my (%mas, @row, @list_forma, @list_id);8. sub show{9. print p center h3 "Заполните все поля и нажмите кнопку";10. push (@row, Tr (td ("Серийный номер", td (textfield (-name => 'serial', -size => '30')))), Tr (td ("Название", td (textfield (-name =>

'name', -size => '30')))), Tr (td ({-align => "left"}, "Форма выпуска", td ({-align => "left"}, popup_menu(-name=>'forma' -value=>\@list_forma)))), Tr (td ("Производитель", td (textfield (-name => 'proizvod', -size => '30')))),Tr (td ("Фирма",td (textfield (-name => 'firma', -size => '30')))),Tr (td ("Цена",

11. td (textfield (-name => 'tsena', -size => '30')))),Tr (td ({-align => "left"}, "№ Аптеки",12. td ({-align => "left"}, scrolling_list(-name=>'nomer_apteki',-value=>\@list_id,13. -labels=>\%mas,-size=>5,-multiple=>1)))),Tr (td ("Картинка",td (textfield (-name => 'kartinka', -size => '30')))),Tr (td(td (submit (-name

=> "choice", -value => "Ввести в базу данных")))));14. print center table (@row);}15. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});16. @list_forma = @{$dbh->selectcol_arrayref("SELECT nazvanie FROM forma")};17. unshift(@list_forma,"Выберите форму выпуска");18. my $sth = $dbh->prepare("SELECT id, nomer, gorod FROM apteki");19. $sth->execute();20. while (my $i = $sth->fetchrow_hashref()){21. push(@list_id, $i->{id});22. $mas{$i->{id}}="№" . $i->{nomer} . "г. " . $i->{gorod};}23. $sth->finish();24. print header(-charset=>'Windows-1251');25. print start_html (-title => "Аптека", -bgcolor=>'wheat');26. print start_form(-action => url ());27. print p br, br, br, br;28. print p center h2 "Внесение нового препарата в базу данных";29. print p hr ({-width => '50%'});30. print p br, br;31. my $choice = param("choice");32. if ($choice eq ""){33. show();}34. elsif ($choice eq "Ввести в базу данных"){35. my ($c, $serial, $name, $forma, $proizvod, $firma, @nomer_apteki, $tsena, $kartinka, @errors);36. $serial = param("serial");37. $name = param("name");38. $forma = param("forma");

100

Page 101: Аптека_ДИПЛОМ.doc

Продолжение приложения А

39. $proizvod = param("proizvod");40. $firma = param("firma");41. @nomer_apteki = param("nomer_apteki");42. $tsena = param("tsena");43. $kartinka = param("kartinka");44. push (@errors, "Поле сериный номер не заполнено") if ($serial eq "" );45. push (@errors, "Поле название не заполнено") if ($name eq "" );46. push (@errors, "Поле форма не заполнено") if ($forma eq "" );47. push (@errors, "Поле производитель не заполнено") if ($proizvod eq "" );48. push (@errors, "Поле фирма не заполнено") if ($firma eq "" );49. push (@errors, "Поле цена не заполнено") if ($tsena eq "" );50. push (@errors, "Поле картинка не заполнено") if ($kartinka eq "" );51. push (@errors, "Сериный номер (поле должно содержать только цифры без пробелов)")52. if $c =($serial =~ tr/[a-z|A-Z|а-я|А-Я|(!@#$%^&*()_+=\|{})[] ;:№?*"|//) !=0;53. push (@errors, "Вы не выбрали форму выпуска") if ($forma eq "Выберите форму выпуска");54. push (@errors, "Производитель (поле должно содержать только буквы)")55. if $c =($proizvod =~ tr/[0-9]|[(!@#$%^&*()_+=\|{})[];:№?*"]//) !=0;56. push (@errors, "Цена (поле должно содержать только цифры)")57. if $c =($tsena =~ tr/[a-z|A-Z|а-я|А-Я|(!@#$%^&*()_+=\|{})[];:№?*"|//) !=0;58. push (@errors, "Каритнка (имя файла не должно содержать следующих знаков:

a) \ / * ? : <>)")59. if $c =($kartinka =~ tr/\/*?:"<>//) !=0;60. if (@errors){61. print p ("Некоторые данные отсутствуют, или содержат ошибки.\n" . " Пожалуйста, заполните(исправьте) следующие поля: ");62. print ul font({-color=>'red'},(li(\@errors)));63. show();}64. else{65. $kartinka = "/img/preparaty/" . $kartinka . ".jpg";66. my $rows = $dbh->do(qq(INSERT INTO preparati SET67. serial = '$serial',68. name ='$name',69. forma ='$forma ',70. proizvod ='$proizvod',71. firma ='$firma',72. nomer_apteki = '@nomer_apteki',73. tsena ='$tsena',74. kartinka ='$kartinka'));75. if ($rows){76. print p center "Ваши данные были занесены в базу данных";}77. else{78. print p center b "Ваши данные не были занесены в базу данных, обратитесь к администратору";}}}79. $dbh->disconnect;80. print end_form();81. print end_html();82. exit(0);

Код скрипта del_aptek.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my @row;8. my $dbh;9. sub show{10. my $sth = $dbh->prepare(qq(select * from apteki));11. $sth->execute();12. my $count = 0;13. while (my $val = $sth->fetchrow_hashref()){14. push (@row, Tr(td( {align=>'center'}, $val->{id}),td( {align=>'center'}, $val->{nomer}),15. td( {align=>'center'}, $val->{adres}),td( {align=>'center'}, $val->{telefon}),td( {align=>'center'}, $val->{gorod}),td( {align=>'center'},

"<A href='$val->{map}' target='down'>показать</A>"),));16. ++$count;}17. print center table ({-border => 1, width=>'60%'},18. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "ID"),19. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "№ аптеки"),20. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Адрес"),21. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Телефон"),22. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Город"),23. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Карта"),@row);24. print center p b ("Всего аптек: " . $count);25. $sth->finish();}

101

Page 102: Аптека_ДИПЛОМ.doc

Продолжение приложения А

26. print header(-charset=>'Windows-1251');27. print start_html (-title => "Аптека", -bgcolor=>'wheat');28. print start_form(-action => url ());29. print p br, br, br, br;30. print p center h2 "Выберите аптеку, которую необходимо удалить";31. print p hr ({-width => '50%'});32. $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});33. my $choice = param("choice");34. if ($choice eq ""){35. show();36. my @list = @{$dbh->selectcol_arrayref("SELECT id FROM apteki")};37. unshift(@list,"Выберите аптеку");38. print center br br popup_menu(-name=>"city", -value=>\@list);39. print center p submit(-name=>"choice", value=>"Удалить");}40. elsif ($choice eq "Удалить"){41. my $city=param("city");42. my $sth1 = $dbh->do("DELETE FROM apteki WHERE id='$city'");43. show();44. if($city eq "Выберите аптеку"){45. print p center "Вы не выбрали аптеку";}46. else{47. if ($sth1 eq "1"){48. print p center "Аптека " . "<b>" . $city ."</b>". " удалена" ;}49. else{50. print p center "Произошла ошибка при удалении аптеки" ." попробуйте заново";}}51. my @list = @{$dbh->selectcol_arrayref("SELECT id FROM apteki")};52. unshift(@list,"Выберите аптеку");53. print center popup_menu(-name=>"city", -value=>\@list);54. print center p submit(-name=>"choice", value=>"Удалить");}55. else{56. print p center (escapeHTML("Логическая ошибка, ". "неправильный выбор: $choice"));}57. $dbh->disconnect;58. print end_form();59. print end_html();60. exit(0);

Код скрипта del_city.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my @row;8. my $dbh;9. sub show{10. my $sth = $dbh->prepare(qq(select * from apteki));11. $sth->execute();12. my $count = 0;13. while (my $val = $sth->fetchrow_hashref()){14. push (@row, Tr(td( {align=>'center'}, $val->{id}),td( {align=>'center'}, $val->{nomer}),15. td( {align=>'center'}, $val->{adres}),td( {align=>'center'}, $val->{telefon}),16. td( {align=>'center'}, $val->{gorod}),td( {align=>'center'}, "<A href='$val->{map}' target='down'>показать</A>"),));17. ++$count;}18. print center table ({-border => 1, width=>'60%'},19. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "ID"),20. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "№ аптеки"),21. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Адрес"),22. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Телефон"),23. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Город"),24. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Карта"),@row);25. print center p b ("Всего аптек: " . $count);26. $sth->finish();}27. print header(-charset=>'Windows-1251');28. print start_html (-title => "Аптека", -bgcolor=>'wheat');29. print start_form(-action => url ());30. print p br, br, br, br;31. print p center h2 "Выберите аптеку, которую необходимо удалить";32. print p hr ({-width => '50%'});33. $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});34. my $choice = param("choice");35. if ($choice eq ""){36. show();

102

Page 103: Аптека_ДИПЛОМ.doc

Продолжение приложения А

37. my @list = @{$dbh->selectcol_arrayref("SELECT id FROM apteki")};38. unshift(@list,"Выберите аптеку");39. print center br br popup_menu(-name=>"city", -value=>\@list);40. print center p submit(-name=>"choice", value=>"Удалить");}41. elsif ($choice eq "Удалить"){42. my $city=param("city");43. my $sth1 = $dbh->do("DELETE FROM apteki WHERE id='$city'");44. show();45. if($city eq "Выберите аптеку"){46. print p center "Вы не выбрали аптеку";}47. else{48. if ($sth1 eq "1"){49. print p center "Аптека " . "<b>" . $city ."</b>". " удалена" ;}50. else{51. print p center "Произошла ошибка при удалении аптеки" .52. " попробуйте заново";}}53. my @list = @{$dbh->selectcol_arrayref("SELECT id FROM apteki")};54. unshift(@list,"Выберите аптеку");55. print center popup_menu(-name=>"city", -value=>\@list);56. print center p submit(-name=>"choice", value=>"Удалить");}57. else{58. print p center (escapeHTML("Логическая ошибка, ". "неправильный выбор: $choice"));}59. $dbh->disconnect;60. print end_form();61. print end_html();62. exit(0);

Код скрипта del_prepar.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my @row;8. print header(-charset=>'Windows-1251');9. print start_html (-title => "Аптека", -bgcolor=>'wheat');10. print start_form(-action => url ());11. print p br, br, br, br;12. print p center h2 "Выберите город, который необходимо удалить";13. print p hr ({-width => '50%'});14. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});15. my $choice = param("choice");16. if ($choice eq ""){17. my @list = @{$dbh->selectcol_arrayref("SELECT name FROM city")};18. unshift(@list,"Выберите город");19. print center br br popup_menu(-name=>"city", -value=>\@list);20. print center p submit(-name=>"choice", value=>"Удалить");}21. elsif ($choice eq "Удалить"){22. my $city=param("city");23. my $sth1 = $dbh->do("DELETE FROM city WHERE name='$city'");24. if($city eq "Выберите город"){25. print p center "Вы не выбрали город";}26. else{27. if ($sth1 eq "1"){28. print p center "Город " . "<b>" . $city ."</b>". " удален" ;}29. else{30. print p center "Произошла ошибка при удалении города" ." попробуйте заново";}}31. my @list = @{$dbh->selectcol_arrayref("SELECT name FROM city")};32. unshift(@list,"Выберите город");33. print center popup_menu(-name=>"city", -value=>\@list);34. print center p submit(-name=>"choice", value=>"Удалить");}35. else{36. print p center (escapeHTML("Логическая ошибка, ". "неправильный выбор: $choice"));}37. $dbh->disconnect;38. print end_form();39. print end_html();40. exit(0);

103

Page 104: Аптека_ДИПЛОМ.doc

Продолжение приложения А

Код скрипта korekt_aptek.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my (@row, @list);8. my $dbh;9. sub show{10. my $sth = $dbh->prepare(qq(select * from apteki));11. $sth->execute();12. my $count = 0;13. while (my $val = $sth->fetchrow_hashref()){14. push (@row, Tr(15. td( {align=>'center'}, $val->{id}),td( {align=>'center'}, $val->{nomer}),16. td( {align=>'center'}, $val->{adres}),td( {align=>'center'}, $val->{telefon}),17. td( {align=>'center'}, $val->{gorod}),td( {align=>'center'}, "<A href='$val->{map}' target='_blank'>показать</A>"),));18. ++$count;}19. print center table ({-border => 1, width=>'60%'},20. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "ID"),21. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "№ аптеки"),22. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Адрес"),23. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Телефон"),24. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Город"),25. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Карта"),@row);26. print p hr ({-width => '50%'});27. print center p b ("Всего аптек: " . $count);28. $sth->finish();29. print center p "Выберите ID аптеки информация, о которой подлежит изменению30. и нажмите кнопку ", b, "Изменить";31. my @list = @{$dbh->selectcol_arrayref("SELECT id FROM apteki")};32. unshift(@list,"Выберите ID");33. print center br br popup_menu(-name=>"change", -value=>\@list);34. print center p submit(-name=>"choice", value=>"Изменить");}35. print header(-charset=>'Windows-1251');36. print start_html (-title => "Аптека", -bgcolor=>'wheat');37. print start_form(-action => url ());38. print p br, br, br, br;39. print p center h2 "Изменение информации об аптеках";40. print p hr ({-width => '50%'});41. print p br, br;42. $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});43. my $choice = param("choice");44. if ($choice eq ""){45. show();}46. elsif ($choice eq "Изменить"){47. @list = @{$dbh->selectcol_arrayref("SELECT name FROM city")};48. my $id = param("change");49. print hidden (-name=>'id', -value=>"$id");50. if ($id ne "Выберите ID"){51. my $sth = $dbh->prepare(qq(select * from apteki where id='$id'));52. $sth->execute();53. my $val = $sth->fetchrow_hashref();54. push (@row, Tr(td( {align=>'center'}, textfield(-name => 'new_nomer', -size =>'20', 55. -value=>$val->{nomer})),td( {align=>'center'}, textfield(-name => 'new_adres', -size =>'20', -value=>$val-

>{adres})),td( {align=>'center'}, textfield(-name => 'new_telefon',56. -size =>'20', -value=>$val>{telefon})),td({align=>'center'},57. popup_menu(name=>'new_gorod', -value=>\@list)),td( {align=>'center'}, textfield(-name => 'new_map',-size =>'20', -value=>$val-

>{'map'})),));58. print center table ({-border => 1, width=>'60%'},59. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "№ аптеки"),60. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Адрес"),61. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Телефон"),62. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Город"),63. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Карта"),@row);64. print center p submit(-name=>"choice", value=>"Ввести изменения");}65. else{66. print p center h3 "Вы не выбрали ID аптеки. Попробуйте снова.";}}67. elsif ($choice eq "Ввести изменения"){68. my $id = param("id");69. my $nomer = param("new_nomer");70. my $adres = param("new_adres");

104

Page 105: Аптека_ДИПЛОМ.doc

Продолжение приложения А

71. my $telefon = param("new_telefon");72. my $gorod = param("new_gorod");73. my $map = param("new_map");74. my $sql = "UPDATE apteki SET75. nomer='$nomer',76. adres='$adres',77. telefon='$telefon',78. gorod='$gorod',79. map='$map'80. WHERE id='$id'";81. my $d = $dbh->do(qq{$sql});82. if ($d ne undef){83. print p center h3 "Информация об аптеке с ID = $id изменена в базе данных.";}84. else{85. print p center h3 "Ошибка при попытке изменения информации в базе данных.86. Обратитесь к администратору";}}87. $dbh->disconnect;88. print end_form();89. print end_html();90. exit(0);

Код скрипта korekt_prepar.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my ($c, $id, %mas, @row, @list_forma, @list_id, @errors);8. my $dbh;9. sub show{10. my $sth = $dbh->prepare(qq(select * from preparati));11. $sth->execute();12. my $count = 0;13. while (my $val = $sth->fetchrow_hashref()){14. push (@row, Tr(td( {align=>'center'}, $val->{id}),15. td( {align=>'center'}, $val->{t}),td( {align=>'center'}, $val->{serial}),16. td( {align=>'center'}, $val->{name}),td( {align=>'center'}, $val->{forma}),17. td( {align=>'center'}, $val->{proizvod}),td( {align=>'center'}, $val->{firma}),18. td( {align=>'center'}, $val->{nomer_apteki}),td( {align=>'center'}, $val->{tsena}),19. td( {align=>'center'}, "<A href='$val->{kartinka}' target='_blank'>$val->{kartinka}</A>"), ));20. ++$count;}21. print center table ({-border => 1, width=>'100%'},22. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "ID"),23. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Время внесения"),24. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Серийный номер"),25. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Название"),26. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Форма выуска"),27. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Производитель"),28. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Фирма"),29. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Номер аптеки"),30. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Цена"),31. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Картинка"),@row);32. print center p b ("Всего препаратов: " . $count);33. $sth->finish();34. print center p "Выберите ID препарата информация, о котором подлежит изменению и нажмите кнопку ", b, "Изменить";35. my @list = @{$dbh->selectcol_arrayref("SELECT id FROM preparati")};36. unshift(@list,"Выберите ID");37. print center popup_menu(-name=>"change", -value=>\@list);38. print center p submit(-name=>"choice", value=>"Изменить");}39. sub show2{40. my $sth = $dbh->prepare(qq(select * from preparati where id='$id'));41. $sth->execute();42. my $val = $sth->fetchrow_hashref();43. print p center h3 "Измените необходимые поля и нажмите кнопку";44. push (@row, Tr (td ("Серийный номер",45. td (textfield (-name => 'new_serial', -value=>$val->{serial}, -size => '30')))),46. Tr (td ("Название",47. td (textfield (-name => 'new_name', -value=>$val->{name}, -size => '30')))),48. Tr (td ({-align => "left"}, "Форма выпуска",49. td ({-align => "left"}, popup_menu(-name=>'new_forma',-value=>\@list_forma)))),50. Tr (td ("Производитель",51. td (textfield (-name => 'new_proizvod', -value=>$val->{proizvod},-size => '30')))),52. Tr (td ("Фирма",td (textfield (-name => 'new_firma', -value=>$val->{firma}, -size => '30')))),

105

Page 106: Аптека_ДИПЛОМ.doc

Продолжение приложения А

53. Tr (td ("Цена",td (textfield (-name => 'new_tsena', -value=>$val->{tsena}, -size => '30')))),54. Tr (td ({-align => "left"}, "№ Аптеки",55. td ({-align => "left"}, scrolling_list(-name=>'new_nomer_apteki',-value=>\@list_id,56. -labels=>\%mas,-size=>5,57. -multiple=>1)))),58. Tr (td ("Картинка",td (textfield (-name => 'new_kartinka', -value=>$val->{kartinka}59. -size => '30')))));60. print center table (@row);61. print center p submit(-name=>"choice", value=>"Ввести изменения");}62. print header(-charset=>'Windows-1251');63. print start_html (-title => "Аптека", -bgcolor=>'wheat');64. print start_form(-action => url ());65. print p br, br, br, br;66. print p center h2 "Изменение информации о препаратах";67. print p hr ({-width => '50%'});68. print p br, br;69. $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});70. my $choice = param("choice");71. if ($choice eq ""){72. show();}73. elsif ($choice eq "Изменить"){74. @list_forma = @{$dbh->selectcol_arrayref("SELECT nazvanie FROM forma")};75. unshift(@list_forma,"Выберите форму выпуска");76. my $sth = $dbh->prepare("SELECT id, nomer, gorod FROM apteki");77. $sth->execute();78. while (my $i = $sth->fetchrow_hashref()){79. push(@list_id, $i->{id});80. $mas{$i->{id}}="№" . $i->{nomer} . "г. " . $i->{gorod};}81. $sth->finish();82. $id = param("change");83. print hidden (-name=>'id', -value=>"$id");84. if ($id ne "Выберите ID"){85. show2();}86. else{87. print p center h3 "Вы не выбрали ID аптеки. Попробуйте снова.";}}88. elsif ($choice eq "Ввести изменения"){89. my $id = param("id");90. my $serial = param("new_serial");91. my $name = param("new_name");92. my $forma = param("new_forma");93. my $proizvod = param("new_proizvod");94. my $firma = param("new_firma");95. my @nomer_apteki = param("new_nomer_apteki");96. my $tsena = param("new_tsena");97. my $kartinka = param("new_kartinka");98. push (@errors, "Поле сериный номер не заполнено") if ($serial eq "" );99. push (@errors, "Поле название не заполнено") if ($name eq "" );100. push (@errors, "Поле форма не заполнено") if ($forma eq "" );101. push (@errors, "Поле производитель не заполнено") if ($proizvod eq "" );102. push (@errors, "Поле фирма не заполнено") if ($firma eq "" );103. push (@errors, "Поле фирма не заполнено") if (@nomer_apteki eq "" );104. push (@errors, "Поле цена не заполнено") if ($tsena eq "" );105. push (@errors, "Поле картинка не заполнено") if ($kartinka eq "" );106. push (@errors, "Сериный номер (поле должно содержать только цифры без пробелов)")107. if $c =($serial =~ tr/[a-z|A-Z|а-я|А-Я|(!@#$%^&*()_+=\|{})[] ;:№?*"|//) !=0;108. push (@errors, "Вы не выбрали форму выпуска") if ($forma eq "Выберите форму выпуска");109. push (@errors, "Производитель (поле должно содержать только буквы)")110. if $c =($proizvod =~ tr/[0-9]|[(!@#$%^&*()_+=\|{})[];:№?*"]//) !=0;111. push (@errors, "Цена (поле должно содержать только цифры)")112. if $c =($tsena =~ tr/[a-z|A-Z|а-я|А-Я|(!@#$%^&*()_+=\|{})[];:№?*"|//) !=0;113. push (@errors, "Каритнка (имя файла не должно содержать следующих знаков: \ / * ? : <>)")114. if $c =($kartinka =~ tr/\/*?:"<>//) !=0;115. if (@errors){116. print p ("Некоторые данные отсутствуют, или содержат ошибки.\n" .117. " Пожалуйста, заполните(исправьте) следующие поля: ");118. print ul font({-color=>'red'},(li(\@errors)));}119. else{120. my $sql = "UPDATE preparati SET121. serial='$serial',122. name='$name',123. forma ='$forma',124. proizvod='$proizvod',125. firma='$firma',126. nomer_apteki ='@nomer_apteki',127. tsena='$tsena',

106

Page 107: Аптека_ДИПЛОМ.doc

Продолжение приложения А

128. kartinka='$kartinka'129. WHERE id='$id'";130. my $d = $dbh->do(qq{$sql});131. if ($d ne undef){132. print p center h3 "Информация о препарате с ID = $id изменена в базе данных.";}133. else{134. print p center h3 "Ошибка при попытке изменения информации в базе данных.135. Обратитесь к администратору";}}}136. $dbh->disconnect;137. print end_form();138. print end_html();139. exit(0);

Код скрипта poisk_aptek.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my (@row, @mas_param, @list);8. my %search_param =(9. "id" => "ID",10. "nomer" => "Номер",11. "adres" => "Адрес",12. "telefon" => "Телефон",13. "gorod" => "Город",14. "map" => "Карта");15. my @field_list =(16. { name => "id", label => "ID",size => 30},17. { name => "nomer", label => "Номер:",size => 30},18. { name => "adres", label => "Адрес:",size => 30},19. { name => "telefon", label => "Телефон:",size => 30},20. { name => "gorod", label => "Город:",size => 30},21. { name => "map", label => "Карта:",size => 20});22. sub show{23. my $field_ref = shift;24. my $search_param = shift;25. foreach my $f (@{$field_ref}){26. my $c;27. foreach my $i (@{$search_param}){28. $c = 1 if ($i eq $f->{name});}29. if ($c eq 1){30. my $label = $f->{label};31. if($f->{name} ne "gorod"){32. push (@row, Tr (33. td (escapeHTML($label),34. td (textfield (-name => $f->{name}, -size => $f->{size})))));}35. else{36. push (@row, Tr (td ({-align => "left"}, escapeHTML($label),37. td ({-align => "left"}, popup_menu(-name=>$f->{name}, -value=>\@list)))));}}}38. print center table (@row),submit (-name => "choice", -value => "Поиск")," ",reset();}39. #main40. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});41. print header(-charset=>'Windows-1251');42. print start_html (-title => "Аптека", -bgcolor=>'wheat');43. print start_form(-action => url ());44. print p br, br, br, br;45. print p center h2 "Поиск аптеки";46. print p hr ({-width => '50%'});47. my $choice = param("choice");48. if ($choice eq ""){49. print p br, br;50. print p center h3 "Выберите значения, по которым будет производиться поиск";51. print p center checkbox_group (-name => "search_param", -values => ["id", "nomer", "adres", "telefon", "gorod", "map"],-labels => \

%search_param);52. print p center submit (-name => "choice", -value => "Выбрать");}53. elsif ($choice eq "Выбрать"){54. @mas_param = param("search_param");55. if ($mas_param[0] ne ""){56. @list = @{$dbh->selectcol_arrayref("SELECT name FROM city")};57. show (\@field_list, \@mas_param);58. print p hidden (-name=>"search_param", -value=>"@mas_param");}

107

Page 108: Аптека_ДИПЛОМ.doc

Продолжение приложения А

59. else{60. print p center "Вы не выбрали параметры поиска";61. print center "<A href='../cgi-bin/poisk_aptek.pl' target='down'>Попробуйте снова</A>"}}62. elsif ($choice eq "Поиск"){63. my $sql = "";64. my @param = param("search_param");65. foreach my $i (@param){66. if (param("$i") ne ""){67. if ($sql eq ""){68. $sql .= " $i=" . "'" . param("$i") . "'";}69. else{70. $sql .= " AND $i=" . "'" . param("$i") . "'";}}}71. $sql = "SELECT * FROM apteki WHERE " . $sql;72. my $sth = $dbh->prepare(qq($sql));73. $sth->execute();74. my $count = 0;75. while (my $val = $sth->fetchrow_hashref()){76. push (@row, Tr(77. td( {align=>'center'}, $val->{id}),78. td( {align=>'center'}, $val->{nomer}),79. td( {align=>'center'}, $val->{adres}),80. td( {align=>'center'}, $val->{telefon}),81. td( {align=>'center'}, $val->{gorod}),82. td( {align=>'center'}, "<A href='$val->{map}' target='_blank'>показать</A>"),));83. ++$count;}84. if ($count ne 0){85. print center table ({-border => 1, width=>'60%'},86. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "ID"),87. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "№ аптеки"),88. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Адрес"),89. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Телефон"),90. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Город"),91. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Карта"),@row);92. print center p b ("Всего аптек: " . $count);}93. else{94. print p center h2 "Данной информации нет в базе данных";}95. $sth->finish();}96. $dbh->disconnect;97. print end_form();98. print end_html();99. exit(0);

Код скрипта poisk_prepar.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my (@row, @mas_param, @list_id, %mas, @list_forma);8. my %search_param =(9. "id" => "ID",10. "serial" => "Серийный номер",11. "name" => "Название",12. "forma" => "Форма выпуска",13. "proizvod" => "Производитель",14. "firma" => "Фирма",15. "nomer_apteki" => "Номер апткеки",16. "tsena" => "Цена",17. "kartinka" => "Картинка");18. my @field_list =(19. { name => "id", label => "ID",size => 30},20. { name => "serial", label => "Серийный номер:",size => 30},21. { name => "name", label => "Название:",size => 30},22. { name => "forma", label => "Форма выпуска:",size => 30},23. { name => "proizvod", label => "Производитель:",size => 30},24. { name => "firma", label => "Фирма:",size => 20},25. { name => "nomer_apteki", label => "Номер аптеки:",size => 30},26. { name => "tsena", label => "Цена:",27. size => 30},28. { name => "kartinka", label => "Картинка:",size => 30});29. sub show{

108

Page 109: Аптека_ДИПЛОМ.doc

Продолжение приложения А

30. my $field_ref = shift;31. my $search_param = shift;32. foreach my $f (@{$field_ref}){33. my $c;34. foreach my $i (@{$search_param}){35. $c = 1 if ($i eq $f->{name});}36. if ($c eq 1){37. my $label = $f->{label};38. if($f->{name} eq "forma"){39. push (@row,Tr (td ({-align => "left"}, "Форма выпуска",40. td ({-align => "left"}, popup_menu(-name=>'forma', -value=>\@list_forma)))));}41. elsif($f->{name} ne "nomer_apteki"){42. push (@row, Tr (td (escapeHTML($label),td (textfield (-name => $f->{name}, -size => $f->{size})))));}43. else{44. push (@row, Tr (td ({-align => "left"}, escapeHTML($label),td ({-align => "left"}, popup_menu(-name=>$f->{name}, -value=>\

@list_id,-labels=>\%mas)))));}}}45. print center table (@row),46. submit (-name => "choice",-value => "Поиск")," ",reset();}47. #main48. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});49. print header(-charset=>'Windows-1251');50. print start_html (-title => "Аптека", -bgcolor=>'wheat');51. print start_form(-action => url ());52. print p br, br, br, br;53. print p center h2 "Поиск аптеки";54. print p hr ({-width => '50%'});55. my $choice = param("choice");56. if ($choice eq ""){57. print p br, br;58. print p center h3 "Выберите значения, по которым будет производиться поиск";59. print p center checkbox_group (-name => "search_param", -values => ["id", "serial", "name", "forma", "proizvod", "firma",

"nomer_apteki", "tsena", "kartinka"], -labels => \%search_param);60. print p center submit (-name => "choice", -value => "Выбрать");}61. elsif ($choice eq "Выбрать"){62. @mas_param = param("search_param");63. if ($mas_param[0] ne ""){64. @list_forma = @{$dbh->selectcol_arrayref("SELECT * FROM forma")};65. my $sth = $dbh->prepare("SELECT id, nomer, gorod FROM apteki");66. $sth->execute();67. while (my $i = $sth->fetchrow_hashref()){68. push(@list_id, $i->{id});69. $mas{$i->{id}}="№" . $i->{nomer} . "г. " . $i->{gorod};}70. $sth->finish();71. show (\@field_list, \@mas_param);72. print p hidden (-name=>"search_param", -value=>"@mas_param");}73. else{74. print p center "Вы не выбрали параметры поиска";75. print center "<A href='../cgi-bin/poisk_prepar.pl' target='down'>Попробуйте снова</A>"}}76. elsif ($choice eq "Поиск"){77. my $sql = "";78. my @param = param("search_param");79. foreach my $i (@param){80. if (param("$i") ne ""){81. if ($sql eq ""){82. $sql .= " $i=" . "'" . param("$i") . "'";}83. else{84. $sql .= " AND $i=" . "'" . param("$i") . "'";}}}85. $sql = "SELECT * FROM preparati WHERE " . $sql;86. my $sth = $dbh->prepare(qq($sql));87. $sth->execute();88. my $count = 0;89. while (my $val = $sth->fetchrow_hashref()){90. push (@row, Tr(td( {align=>'center'}, $val->{id}),91. td( {align=>'center'}, $val->{t}),td( {align=>'center'}, $val->{serial}),92. td( {align=>'center'}, $val->{name}),td( {align=>'center'}, $val->{forma}),93. td( {align=>'center'}, $val->{proizvod}),td( {align=>'center'}, $val->{firma}),94. td( {align=>'center'}, $val->{nomer_apteki}),td( {align=>'center'}, $val->{tsena}),95. td( {align=>'center'}, "<A href='$val->{kartinka}'target='_blank'>показать</A>")));96. ++$count;}97. if ($count ne 0){98. print center table ({-border => 1, width=>'100%'},99. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "ID"),100. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Время внесения"),101. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Серийный номер:"),102. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Название:"),

109

Page 110: Аптека_ДИПЛОМ.doc

Продолжение приложения А

103. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Форма выпуска:"),104. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Производитель:"),105. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Фирма:"),106. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Номер аптеки:"),107. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Цена:"),108. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Картинка:"),@row);109. print center p b ("Всего аптек: " . $count);}110. else{111. print p center h2 "Данной информации нет в базе данных";}112. $sth->finish();}113. $dbh->disconnect;114. print end_form();115. print end_html();exit(0);

Код скрипта show_aptek.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my @row;8. print header(-charset=>'Windows-1251');9. print start_html (-title => "Аптека", -bgcolor=>'wheat');10. print start_form(-action => url ());11. print p br, br, br, br;12. print p center h2 "Список аптек";13. print p hr ({-width => '50%'});14. print p br, br;15. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});16. my $sth = $dbh->prepare(qq(select * from apteki));17. $sth->execute();18. my $count = 0;19. while (my $val = $sth->fetchrow_hashref()){20. push (@row, Tr(td( {align=>'center'}, $val->{id}),td( {align=>'center'}, $val->{nomer}),21. td( {align=>'center'}, $val->{adres}),td( {align=>'center'}, $val->{telefon}),22. td( {align=>'center'}, $val->{gorod}),td( {align=>'center'}, "<A href='$val->{map}' target='_blank'>показать</A>")));23. ++$count;}24. print center table ({-border => 1, width=>'60%'},25. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "ID"),26. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "№ аптеки"),27. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Адрес"),28. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Телефон"),29. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Город"),30. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Карта"),@row);31. print center p b ("Всего аптек: " . $count);32. $sth->finish();33. $dbh->disconnect;34. print end_form();35. print end_html();36. exit(0);

Код скрипта show_city.pl

1. #!c:\perl\bin\perl

2. use strict;

3. use CGI qw(:all);

4. use DBI;

5. my $host="127.0.0.1";

6. my $db_name="apteka";

7. my @row;

8. print header(-charset=>'Windows-1251');

9. print start_html (-title => "Аптека", -bgcolor=>'wheat');

10. print start_form(-action => url ());

11. print p br, br, br, br;

12. print p center h2 "Города, в которых расположены аптеки";

13. print p hr ({-width => '50%'});

110

Page 111: Аптека_ДИПЛОМ.doc

14. print p br, br;

Продолжение приложения А

15. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});

16. my $sth = $dbh->prepare(qq(select name from city));

17. $sth->execute();

18. my $count = 0;

19. while (my $val = $sth->fetchrow_hashref()){

20. push (@row, Tr(td({-align => 'center'}, $val->{name})));

21. ++$count;}

22. print center table ({-border => 1},td(font{-color => 'blue', -size=>'4'},"Название города"), @row);

23. print center p b ("Всего городов: " . $count);

24. $sth->finish();

25. $dbh->disconnect;

26. print end_form();

27. print end_html();

28. exit(0);

Код скрипта show_prepar.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my (@row, $adres, $id, $a);8. print header(-charset=>'Windows-1251');9. print start_html (-title => "Аптека", -bgcolor=>'wheat');10. print start_form(-action => url ());11. print p br, br, br, br;12. print p center h2 "Список препаратов";13. print p hr ({-width => '50%'});14. print p br, br;15. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});16. my $sth = $dbh->prepare(qq(select * from preparati));17. $sth->execute();18. my $count = 0;19. while (my $val = $sth->fetchrow_hashref()){20. push (@row, Tr(21. td( {align=>'center'}, $val->{id}),td( {align=>'center'}, $val->{t}),22. td( {align=>'center'}, $val->{serial}),td( {align=>'center'}, $val->{name}),23. td( {align=>'center'}, $val->{forma}),td( {align=>'center'}, $val->{proizvod}),24. td( {align=>'center'}, $val->{firma}),td( {align=>'center'}, $val->{nomer_apteki}),25. td( {align=>'center'}, $val->{tsena}),td( {align=>'center'}, "<A href='$val->{kartinka}' target='_blank'>показать</A>")));26. ++$count;}27. print center table ({-border => 1, width=>'100%'},28. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "ID"),29. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Время внесения"),30. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Серийный номер"),31. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Название"),32. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Форма выуска"),33. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Производитель"),34. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Фирма"),35. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Номер аптеки"),36. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Цена"),37. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Картинка"),@row);38. print center p b ("Всего препаратов: " . $count);39. $sth->finish();40. $dbh->disconnect;41. print end_form();42. print end_html();43. exit(0);

Код скрипта reg_user.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $c=0;

111

Page 112: Аптека_ДИПЛОМ.doc

6. my $host="127.0.0.1";7. my $db_name="apteka";

Продолжение приложения А

8. my (@row, $dbh, $rows1);9. my @field_list =(10. { name => "login", label => "Логин:",size => 30, req => 1},11. { name => "name", label => "Имя:",size => 30, req => 1},12. { name => "famil", label => "Фамилия:",size => 30, req => 1},13. { name => "organization", label => "Организиция:",size => 30},14. { name => "e_mail", label => "e-mail:",size => 30},15. { name => "telefon", label => "Телефон:",size => 30, req => 1});16. sub make_password{17. my $password;18. my $c=0;19. while ($c eq 0){20. my $p = int(rand 9999);21. if ($p > 1000){22. my $tb = $dbh->prepare("SELECT password FROM user WHERE password='$p'");23. $tb->execute();24. my $ref = $tb->fetchrow_arrayref;25. if ($ref->[0] eq ""){26. $password = $p;27. $c = 1;}28. $tb->finish();}}29. return $password;}30. #Proverka email31. sub chek_mail{32. my $mail = shift;33. my $c =($mail =~ tr/\@/@/);34. $c +=($mail =~ s/^\@/@/);35. $c +=($mail =~ s/\@$/@/);36. return $c;}37. sub display_entry_form{38. my $field_ref = shift;39. my $st = shift;40. my $send = shift;41. my @row;42. print p center h3 ($st);43. foreach my $f (@{$field_ref}){44. my $label = $f->{label};45. $label .= "*" if $f->{req};46. if ($f->{name} eq "passw1" || $f->{name} eq "passw2"){47. push (@row, Tr (td (escapeHTML($label),td (password_field (-name => $f->{name}, -size => $f->{size})))));}48. else{49. push (@row, Tr (td (escapeHTML($label),td (textfield (-name => $f->{name}, -size => $f->{size})))));}}50. print center table (@row),51. submit (-name => "choice", -value => $send),52. end_form(), end_html();}53. #Proverka formi54. sub process_form{55. my $field_ref = shift;56. my (@errors);57. foreach my $f (@{$field_ref}){58. $c = 0;59. my $value = param ($f->{name});60. $value = "" unless defined ($value);61. $value =~ s/^\s+//;62. $value =~ s/\s+$//;63. $f->{value} = $value;64. push (@errors, $f->{label}) if $value eq "" && $f->{req};65. if ($f->{name} eq "famil" || $f->{name} eq "name"){66. push (@errors, $f->{label}."(поле должно содержать только буквы)")67. if $c =($f->{value} =~ tr/[0-9]|[(!@#$%^&*()_+=\|{})[];:№?*"]//) !=0;}}68. my $login1 = param("login");69. my $tb = $dbh->prepare("SELECT login FROM user WHERE login='$login1'");70. $tb->execute();71. my $ref = $tb->fetchrow_arrayref;72. if ($ref->[0] ne ""){73. push (@errors, "Данный логин уже существует, придумайте другой");}74. $tb->finish();75. push (@errors, "Телефон (поле должно содержать только цифры, например, 334422)")76. if $c =(param("telefon") =~ tr/[a-z|A-Z|а-я|А-Я|(!@#$%^&*()_+=\|{})[];:№?*"|//) !=0;77. push (@errors, "e-mail (пример ivan\@email.ru)") if ($c=chek_mail(param("e_mail"))) != 1 && param("e_mail") ne "";78. if (@errors){79. print ("Некоторые данные отсутствуют.\n" . " Пожалуйста, заполните следующие поля: ");80. s/:$// foreach (@errors);

112

Page 113: Аптека_ДИПЛОМ.doc

81. print ul (font({-color=>'red', -size=>'3'}, li(\@errors)));82. display_entry_form ($field_ref, "","send");

Продолжение приложения А

83. return;}84. else{85. insert_record ($field_ref);}}86. #Zapis v table87. sub insert_record{88. my $field_ref = shift;89. my ($password, @row);90. my $stmt ="";91. foreach my $f (@{$field_ref}){92. next if ($f->{value} eq "");93. $stmt .= "," if $stmt;94. $stmt .= $f->{name} . " = " . $dbh->quote($f->{value});}95. $password = make_password();96. $stmt = "INSERT INTO user SET $stmt, passw='$password'";97. my $rows = $dbh->do($stmt);98. if ($rows){99. foreach my $f (@{$field_ref}){100. next if ($f->{value} eq "");101. push (@row, Tr (td (font({-size=>'4'}, $f->{label}),td (font({-size=>'4'},$f->{value})),102. Tr (),Tr ())));}103. push (@row, Tr (td (font({-size=>'4'},"Пароль: "),td (font({-size=>'4', -color=>'red'},$password)))));104. print center table ({-width=>'25%'},@row);105. print p center font({-size=>'4'},"Ваши данные были занесены в базу данных ");106. print p center font({-size=>'4', -color=>'blue'},107. "Вам выдан персональный пароль(он выделен красным цветом),108. его необходимо обязательно запомнить!!!");109. print p center "<A href=../cgi-bin/zakaz.pl> Сделать заказ</A><br>";}110. else{111. print p center b "Ваши данные не были занесены в базу данных, обратитесь к администратору";}}112. print header(-charset=>'Windows-1251');113. print start_html (-title => "Аптека", -bgcolor=>'powderblue');114. print start_form(-action => url ());115. print p br;116. print p center h2 "Регистрация пользователя";117. print p hr ({-width => '50%'});118. print p br;119. my $stmt = "Пожалуйста, заполните анкету\n"120. . " и щелкните на кнопке "121. . strong("send" . ". ") . "(Символом '*' отмечены обязательные\n". " для заполнения поля.)\n";122. $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});123. my $choice = param("choice");124. if ($choice eq ""){125. my $send = "send";126. display_entry_form (\@field_list,$stmt,$send);}127. elsif ($choice eq "send"){128. process_form(\@field_list);}129. else{130. print p (escapeHTML("Логическая ошибка, ". "неправильный выбор: $choice"));}131. $dbh->disconnect;132. print end_form();133. print end_html();134. exit(0);

Код скрипта show_user.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my (@row, $adres, $id, $a);8. print header(-charset=>'Windows-1251');9. print start_html (-title => "Аптека", -bgcolor=>'wheat');10. print start_form(-action => url ());11. print p br, br, br, br;12. print p center h2 "Список пользователей";13. print p hr ({-width => '50%'});14. print p br, br;15. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf",{PrintError => 0, RaiserError =>1});16. my $sth = $dbh->prepare(qq(select * from user));

113

Page 114: Аптека_ДИПЛОМ.doc

17. $sth->execute();18. my $count = 0;

Продолжение приложения А

19. while (my $val = $sth->fetchrow_hashref()){20. push (@row, Tr(td( {align=>'center'}, $val->{id}),td( {align=>'center'}, $val->{t}),21. td( {align=>'center'}, $val->{login}),td( {align=>'center'}, $val->{name}),22. td( {align=>'center'}, $val->{famil}),td( {align=>'center'}, $val->{organization}),23. td( {align=>'center'}, $val->{e_mail}),td( {align=>'center'}, $val->{telefon}),24. td( {align=>'center'}, $val->{passw})));25. ++$count;26. }27. print center table ({-border => 1, width=>'100%'},28. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "ID"),29. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Время регистрации"),30. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Логин"),31. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Имя"),32. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Фамилия"),33. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Организация"),34. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "e-mail"),35. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Телефон"),36. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Пароль"),@row);37. print center p b ("Всего зарегистрированных пользователей: " . $count);38. $sth->finish();39. $dbh->disconnect;40. print end_form();41. print end_html();42. exit(0);

Код скрипта korekt_user.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my ($c, $login, $login1, %mas, @row, @errors);8. my $dbh;9. sub chek_mail{10. my $mail = shift;11. my $c =($mail =~ tr/\@/@/);12. $c +=($mail =~ s/^\@/@/);13. $c +=($mail =~ s/\@$/@/);14. return $c;}15. sub show{16. my $sth = $dbh->prepare(qq(select * from user));17. $sth->execute();18. my $count = 0;19. while (my $val = $sth->fetchrow_hashref()){20. push (@row, Tr(21. td( {align=>'center'}, $val->{id}),td( {align=>'center'}, $val->{t}),22. td( {align=>'center'}, $val->{login}),td( {align=>'center'}, $val->{name}),23. td( {align=>'center'}, $val->{famil}),td( {align=>'center'}, $val->{organization}),24. td( {align=>'center'}, $val->{e_mail}),td( {align=>'center'}, $val->{telefon}),25. td( {align=>'center'}, $val->{passw})));26. ++$count;}27. print center table ({-border => 1, width=>'100%'},28. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "ID"),29. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Время регистрации"),30. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Логин"),31. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Имя"),32. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Фамилия"),33. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Организация"),34. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "e-mail"),35. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Телефон"),36. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Пароль"),@row);37. print center p b ("Всего пользователей: " . $count);38. $sth->finish();39. print center p "Выберите логин пользователя информация, о котором подлежит изменению и нажмите кнопку ", b, "Изменить";40. my @list = @{$dbh->selectcol_arrayref("SELECT login FROM user")};41. unshift(@list,"Выберите логин");42. print center popup_menu(-name=>"change", -value=>\@list);43. print center p submit(-name=>"choice", value=>"Изменить");}44. sub show2{45. my $log1 = shift;

114

Page 115: Аптека_ДИПЛОМ.doc

46. my $sth = $dbh->prepare(qq(select * from user where login='$log1'));47. $sth->execute();48. my $val = $sth->fetchrow_hashref();

Продолжение приложения А

49. print p center h3 "Измените необходимые поля и нажмите кнопку";50. push (@row, Tr (td ("Логин",51. td (textfield (-name => 'new_login', -value=>$val->{login}, -size => '30')))),52. Tr (td ("Имя",53. td (textfield (-name => 'new_name', -value=>$val->{name}, -size => '30')))),54. Tr (td ("Фамилия",55. td (textfield (-name => 'new_famil', -value=>$val->{famil}, -size => '30')))),56. Tr (td ("Организация",57. td (textfield (-name => 'new_organization', -value=>$val->{organization},58. -size => '30')))),59. Tr (td ("e-mail",60. td (textfield (-name => 'new_e-mail',-value=>$val->{e_mail},-size => '30')))),61. Tr (td ("Телефон",62. td (textfield (-name => 'new_telefon', -value=>$val->{telefon}, -size => '30')))),63. Tr (td ("Пароль",64. td (textfield (-name => 'new_password', -value=>$val->{passw},-size => '30')))));65. print center table (@row);66. print center p submit(-name=>"choice", value=>"Ввести изменения");}67. print header(-charset=>'Windows-1251');68. print start_html (-title => "Аптека", -bgcolor=>'wheat');69. print start_form(-action => url ());70. print p br, br, br, br;71. print p center h2 "Изменение информации о пользователях";72. print p hr ({-width => '50%'});73. print p br, br;74. $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});75. my $choice = param("choice");76. if ($choice eq ""){77. show();}78. elsif ($choice eq "Изменить"){79. $login1 = param("change");80. print hidden (-name=>"my_login", -value=>"$login1");81. if ($login1 ne "Выберите логин"){82. show2($login1);}83. else{84. print p center h3 "Вы не выбрали логин пользователь. Попробуйте снова.";}}85. elsif ($choice eq "Ввести изменения"){86. my $id = param("id");87. my $log = param("new_login");88. my $old_login = param("my_login");89. my $name = param("new_name");90. my $famil = param("new_famil");91. my $organization = param("new_organization");92. my $e_mail = param("new_e-mail");93. my $telefon = param("new_telefon");94. my $password = param("new_password");95. my $passw_len = length($password);96. push (@errors, "Поле логин не заполнено") if ($log eq "" );97. push (@errors, "Поле имя не заполнено") if ($name eq "" );98. push (@errors, "Поле фамилия не заполнено") if ($famil eq "" );99. push (@errors, "Поле телефон не заполнено") if ($telefon eq "" );100. push (@errors, "Поле пароль не заполнено") if ($password eq "" );101. if ($log ne $old_login){102. my $tb = $dbh->prepare("SELECT login FROM user WHERE login='$log'");103. $tb->execute();104. my $ref = $tb->fetchrow_arrayref;105. if ($ref->[0] ne ""){106. push (@errors, "Данный логин уже существует, придумайте другой");}107. $tb->finish();}108. push (@errors, "Имя (поле должно содержать только буквы)")109. if $c =($name =~ tr/[0-9]|[(!@#$%^&*()_+=\|{})[];:№?*"]//) !=0;110. push (@errors, "Фамилия (поле должно содержать только буквы)")111. if $c =($famil =~ tr/[0-9]|[(!@#$%^&*()_+=\|{})[];:№?*"]//) !=0;112. push (@errors, "e-mail (например, ivan" . "@" ."mail.ru)")113. if ($c = chek_mail($e_mail)) != 1;114. push (@errors, "Телефон (поле должно содержать только цифры без пробелов)")115. if $c =($telefon =~ tr/[a-z|A-Z|а-я|А-Я|(!@#$%^&*()_+=\|{})[] ;:№?*"|//) !=0;116. push (@errors, "Пароль (поле должно содержать только цифры без пробелов)")117. if $c =($password =~ tr/[a-z|A-Z|а-я|А-Я|(!@#$%^&*()_+=\|{})[] ;:№?*"|//) !=0;118. push (@errors, "Пароль (поле должно 4 цифры)")119. if ($passw_len ne 4) && ($password ne "");120. if (@errors){

115

Page 116: Аптека_ДИПЛОМ.doc

121. print p ("Некоторые данные отсутствуют, или содержат ошибки.\n" .122. " Пожалуйста, заполните(исправьте) следующие поля: ");123. print ul font({-color=>'red'},(li(\@errors)));

Продолжение приложения А

124. print hidden (-name=>"my_login", -value=>"$old_login");125. show2($old_login);}126. else{127. my $sql = "UPDATE user SET128. login='$log',129. name='$name',130. famil ='$famil',131. organization='$organization',132. e_mail='$e_mail',133. telefon ='$telefon',134. passw ='$password'135. WHERE login='$old_login'";136. my $d = $dbh->do(qq{$sql});137. if ($d ne undef){138. print p center h3 "Информация о пользователе с логином = $old_login изменена в базе данных.";}139. else{140. print p center h3 "Ошибка при попытке изменения информации в базе данных.141. Обратитесь к администратору";}}}142. $dbh->disconnect;143. print end_form();144. print end_html();145. exit(0);

Код скрипта del_user.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my @row;8. print header(-charset=>'Windows-1251');9. print start_html (-title => "Аптека", -bgcolor=>'wheat');10. print start_form(-action => url ());11. print p br, br, br, br;12. print p center h2 "Выберите пользователя, которого необходимо удалить";13. print p hr ({-width => '50%'});14. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});15. my $choice = param("choice");16. if ($choice eq ""){17. my @list = @{$dbh->selectcol_arrayref("SELECT login FROM user")};18. unshift(@list,"Выберите пользователя");19. print center br br popup_menu(-name=>"city", -value=>\@list);20. print center p submit(-name=>"choice", value=>"Удалить");}21. elsif ($choice eq "Удалить"){22. my $city=param("city");23. my $sth1 = $dbh->do("DELETE FROM user WHERE login='$city'");24. if($city eq "Выберите пользователя"){25. print p center "Вы не выбрали пользователя";}26. else{27. if ($sth1 eq "1"){28. print p center "Пользователь" . "<b>" . $city ."</b>". " удален" ;}29. else{30. print p center "Произошла ошибка при удалении пользователя" ." попробуйте заново";}}31. my @list = @{$dbh->selectcol_arrayref("SELECT login FROM user")};32. unshift(@list,"Выберите пользователя");33. print center popup_menu(-name=>"city", -value=>\@list);34. print center p submit(-name=>"choice", value=>"Удалить");}35. else{36. print p center (escapeHTML("Логическая ошибка, ". "неправильный выбор: $choice"));}37. $dbh->disconnect;38. print end_form();39. print end_html();40. exit(0);

Код скрипта poisk_user.pl

116

Page 117: Аптека_ДИПЛОМ.doc

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);

Продолжение приложения А

4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my (@row, @mas_param, @list_id, %mas, @list_forma);8. my %search_param =(9. "id" => "ID",10. "login" => "Логин",11. "name" => "Имя",12. "famil" => "Фамилия",13. "organization" => "Организация",14. "e_mail" => "e-mail",15. "telefon" => "Телефон",16. "passw" => "Пароль");17. my @field_list =(18. { name => "id", label => "ID",size => 30},19. { name => "login", label => "Логин:",size => 30},20. { name => "name", label => "Имя:",size => 30},21. { name => "famil", label => "Фамилия:",size => 30},22. { name => "organization", label => "Организиция:",size => 30},23. { name => "e_mail", label => "e-mail:",size => 30},24. { name => "passw", label => "Пароль:",size => 30});25. sub show{26. my $field_ref = shift;27. my $search_param = shift;28. foreach my $f (@{$field_ref}){29. my $c;30. foreach my $i (@{$search_param}){31. $c = 1 if ($i eq $f->{name});}32. if ($c eq 1){33. my $label = $f->{label};34. push (@row, Tr (td (escapeHTML($label),td (textfield (-name => $f->{name}, -size => $f->{size})))));}}35. print center table (@row),submit (-name => "choice", -value => "Поиск")," ",reset();}36. #main37. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});38. print header(-charset=>'Windows-1251');39. print start_html (-title => "Аптека", -bgcolor=>'wheat');40. print start_form(-action => url ());41. print p br, br, br, br;42. print p center h2 "Поиск пользователя";43. print p hr ({-width => '50%'});44. my $choice = param("choice");45. if ($choice eq ""){46. print p br, br;47. print p center h3 "Выберите значения, по которым будет производиться поиск";48. print p center checkbox_group (-name => "search_param",49. -values => ["id", "login", "name", "famil", "organization", "e_mail", "telefon", "passw"], -labels => \%search_param);50. print p center submit (-name => "choice", -value => "Выбрать");}51. elsif ($choice eq "Выбрать"){52. @mas_param = param("search_param");53. if ($mas_param[0] ne ""){54. show (\@field_list, \@mas_param);55. print p hidden (-name=>"search_param", -value=>"@mas_param");}56. else{57. print p center "Вы не выбрали параметры поиска";58. print center "<A href='../cgi-bin/poisk_user.pl' target='down'>Попробуйте снова</A>"}}59. elsif ($choice eq "Поиск"){60. my $sql = "";61. my @param = param("search_param");62. foreach my $i (@param){63. if (param("$i") ne ""){64. if ($sql eq ""){65. $sql .= " $i=" . "'" . param("$i") . "'";}66. else{67. $sql .= " AND $i=" . "'" . param("$i") . "'";}}}68. $sql = "SELECT * FROM user WHERE " . $sql;69. my $sth = $dbh->prepare(qq($sql));70. $sth->execute();71. my $count = 0;72. while (my $val = $sth->fetchrow_hashref()){73. push (@row, Tr(td( {align=>'center'}, $val->{id}),74. td( {align=>'center'}, $val->{t}),td( {align=>'center'}, $val->{login}),75. td( {align=>'center'}, $val->{name}),td( {align=>'center'}, $val->{famil}),

117

Page 118: Аптека_ДИПЛОМ.doc

76. td( {align=>'center'}, $val->{organization}),td( {align=>'center'}, $val->{e_mail}),77. td( {align=>'center'}, $val->{telefon}),td( {align=>'center'}, $val->{passw})));78. ++$count;}

Продолжение приложения А

79. if ($count ne 0){80. print center table ({-border => 1, width=>'100%'},81. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "ID"),82. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Время регистрации"),83. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Логин"),84. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Имя"),85. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Фамиля"),86. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Организация"),87. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "e-mail"),88. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Телефон"),89. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Пароль"),@row);90. print center p b ("Всего пользователей: " . $count);}91. else{92. print p center h2 "Данной информации нет в базе данных";}93. $sth->finish();}94. $dbh->disconnect;95. print end_form();96. print end_html();97. exit(0);

Код скрипта zakaz.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my (@row, $adres, $id, $a);8. sub chek_forms{9. my $mas = shift;10. my $c=0;11. foreach my $i (@{$mas}){12. $c=1 if ($i eq "");}13. return $c;}14. print header(-charset=>'Windows-1251');15. print start_html (-title => "Аптека", -bgcolor=>'powderblue');16. print start_form(-action => url ());17. print p br;18. print p center h2 "Заказ препаратов";19. print p hr ({-width => '50%'});20. print p br;21. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});22. my $choice = param("choice");23. if ($choice eq ""){24. print p center h3 "Введите ваши данные и нажмите кнопку";25. push (@row, Tr ( td ("Логин"),td (),td (textfield (-name => 'login', -size => '10')),26. Tr(td ("Пароль"),td (),td (password_field (-name => 'passw', -size => '10')))));27. print center table ({-border => 0}, @row), br submit (-name => "choice",-value => "Вход");}28. elsif ($choice eq "Вход"){29. my $login = param("login");30. my $passw = param("passw");31. print p hidden(-name=>"login", -value=>"$login");32. if ($login ne "" || $passw ne ""){33. my $sql = "SELECT id FROM user WHERE login='$login' AND passw ='$passw'";34. my $tb = $dbh->prepare($sql);35. $tb->execute();36. my $ref = $tb->fetchrow_arrayref;37. $tb->finish();38. if ($ref->[0] ne ""){39. print p center h3 "Для того, чтобы закзать препарат поставьте галачку напротв ". "его ID номера и укажите необходимое

количество упаковок";40. my $sth = $dbh->prepare(qq(select * from preparati));41. $sth->execute();42. while (my $val = $sth->fetchrow_hashref()){43. push (@row, Tr(44. td(checkbox_group (-name => "zakaz", -values =>$val->{id})),45. td({align=>'center'},textfield (-name =>"$val->{id}", -size =>"4")),td($val->{name}),46. td($val->{forma}),td($val->{proizvod}),td($val->{firma}),td($val->{opt_tsena}),

118

Page 119: Аптека_ДИПЛОМ.doc

47. td("<A href='$val->{kartinka}' target='_blank'>показать</A>"),));}48. $sth->finish();49. print center table ({-border => 1, width=>'70%'},

Продолжение приложения А

50. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "ID"),51. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Кол-во"),52. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Название"),53. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Форма выуска"),54. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Производитель"),55. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Фирма"),56. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "оптова цена"),57. td({align=>'center'},font{-color => 'blue', -size=>'4'}, "Картинка"),@row);58. print center p submit(-name=>"choice", value=>"Заказать");}59. else{60. print p br br br center font({-color=>'red', -size=>'5'},"Вам отказано в доступе, пройдите регистрацию");}}61. else{62. print p br br br center font({-color=>'red', -size=>'5'},"Вы не заполнили все поля попробуйте снова");}}63. elsif($choice eq "Заказать"){64. my @zakaz = param("zakaz");65. my $login = param("login");66. my (@kol_zakaz, $c);67. my $chk_forms = 0;68. my $razmer = 0;69. $c=0;70. foreach my $i (@zakaz){71. $kol_zakaz[$c] = param($i);72. $c++;}73. foreach my $i (@kol_zakaz){74. $razmer = 1 if ($i eq "");}75. $chk_forms = 1 if (chek_forms(\@zakaz) != 0 || chek_forms(\@kol_zakaz) != 0);76. if (($razmer eq "0") && ($chk_forms eq "0")){77. my $rows = $dbh->do(qq(INSERT INTO zakaz SET78. login = '$login',79. preparati ='@zakaz',80. kolich ='@kol_zakaz'));81. if ($rows){82. print p center "Ваши данные были занесены в базу данных";}83. else{84. print p center b "Ваши данные не были занесены в базу данных, обратитесь к администратору";}}85. else{86. print p center h3 "Вы не заполнили все поля, попробуйте снова";}}87. $dbh->disconnect;88. print end_form();89. print end_html();90. exit(0);

Код скрипта show_zakaz.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my @row;8. print header(-charset=>'Windows-1251');9. print start_html (-title => "Аптека", -bgcolor=>'wheat');10. print start_form(-action => url ());11. print p center h2 "Список заказов";12. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});13. my $sth = $dbh->prepare(qq(select * from zakaz));14. $sth->execute();15. my $count = 0;16. print p hr({-width => '100%'});17. while (my $val = $sth->fetchrow_hashref()){18. my $sum = 0;19. my $sth = $dbh->prepare(qq(select * from user where login = '$val->{login}'));20. $sth->execute();21. my $st = $sth->fetchrow_hashref();22. print p font({-color=>'red', size=>'4'}, "Заказ № ", ++$count);23. print p h4 "ID номер заказа: ", u ($val->{id});24. print p h4 "Время внесения заказа: ", u ($val->{t});25. print p h4 "Логин закзчика: ", u ($val->{login});26. print p h4 "Фамилия, имя закзчика: ", u ($st->{famil}, $st->{name});

119

Page 120: Аптека_ДИПЛОМ.doc

27. print p h4 "Организация закзчика: ", u ($st->{organization});28. print p h4 "Телефон закзчика: ", u ($st->{telefon});29. print p h4 "e-mail закзчика: ", u ($st->{e_mail});

Продолжение приложения А

30. $sth->finish();31. print p font({-color=>'blue', size=>'4'},"Заказано:");32. my @mas = split (/ /, $val->{preparati});33. my @mas_kol = split (/ /, $val->{kolich});34. my $c = 0;35. foreach my $i (@mas){36. $sth = $dbh->prepare(qq(select * from preparati where id = '$i'));37. $sth->execute();38. $st = $sth->fetchrow_hashref();39. print p li (font({-color=>'blue'},40. "Сериный номер ", font({-color=>'green'}, $st->{serial}), ", ",41. "Название ", font({-color=>'green'}, $st->{name}), ", ",42. "Форма выпуска ", font({-color=>'green'}, $st->{forma}), ", ",43. "Производитель ", font({-color=>'green'}, $st->{proizvod}), ", ",44. "Фирма ", font({-color=>'green'}, $st->{firma}), ", ",45. "Цена = ", font({-color=>'green'}, $st->{opt_tsena}), ", ",46. "Количество ", font({-color=>'green'}, $mas_kol[$c])));47. $sum += $st->{opt_tsena} * $mas_kol[$c];48. $c++;}49. print p b "Итого сумма заказа = $sum тенге";50. print p hr({-width => '100%'});}51. $sth->finish();52. $dbh->disconnect;53. print end_form();54. print end_html();55. exit(0);

Код скрипта del_zakaz.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my @row;8. print header(-charset=>'Windows-1251');9. print start_html (-title => "Аптека", -bgcolor=>'wheat');10. print start_form(-action => url ());11. print p br, br, br, br;12. print p center h2 "Выберите ID заказа, который необходимо удалить";13. print p hr ({-width => '50%'});14. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});15. my $choice = param("choice");16. if ($choice eq ""){17. my @list = @{$dbh->selectcol_arrayref("SELECT ID FROM zakaz")};18. unshift(@list,"Выберите ID");19. print center br br popup_menu(-name=>"city", -value=>\@list);20. print center p submit(-name=>"choice", value=>"Удалить");}21. elsif ($choice eq "Удалить"){22. my $city=param("city");23. my $sth1 = $dbh->do("DELETE FROM zakaz WHERE id='$city'");24. if($city eq "Выберите ID"){25. print p center "Вы не выбрали ID заказа";}26. else{27. if ($sth1 eq "1"){28. print p center "Заказ с ID " . "<b>" . $city ."</b>". " удален" ;}29. else{30. print p center "Произошла ошибка при удалении города" . " попробуйте заново";}}31. my @list = @{$dbh->selectcol_arrayref("SELECT id FROM zakaz")};32. unshift(@list,"Выберите ID");33. print center popup_menu(-name=>"city", -value=>\@list);34. print center p submit(-name=>"choice", value=>"Удалить");}35. else{36. print p center (escapeHTML("Логическая ошибка, ". "неправильный выбор: $choice"));}37. $dbh->disconnect;38. print end_form();39. print end_html();40. exit(0);

120

Page 121: Аптека_ДИПЛОМ.doc

Код скрипта poisk_zakaz.pl

Продолжение приложения А

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my (@row, @mas_param, $dbh);8. my %search_param =(9. "id" => "ID",10. "login" => "Логин");11. my @field_list =(12. { name => "id", label => "ID заказа",size => 30},13. { name => "login", label => "Логин заказчика:",size => 30},14. { name => "preparati", label => "ID заказанного препарата:",size => 30},15. { name => "kolich", label => "Количество заказанного препарата:",size => 30});16. sub show{17. my $field_ref = shift;18. my $search_param = shift;19. foreach my $f (@{$field_ref}){20. my $c;21. foreach my $i (@{$search_param}){22. $c = 1 if ($i eq $f->{name});}23. if ($c eq 1){24. my $label = $f->{label};25. push (@row, Tr (td (escapeHTML($label),td (textfield (-name => $f->{name}, -size => $f->{size})))));}}26. print p br, br, br, br;27. print center table (@row);28. print center br submit (-name => "choice", -value => "Поиск")," ", reset();}29. sub poisk{30. my $poisk = shift;31. my $pole = shift;32. my @mas;33. my $c = 0;34. my $sth = $dbh->prepare(qq(SELECT $pole FROM zakaz));35. $sth->execute();36. while (my $val = $sth->fetchrow_hashref()){37. @mas = split (/ /, $val->{$pole});38. foreach my $i (@mas){39. $c = $val->{id} if $i eq $poisk;}}40. return $c;}41. #main42. print header(-charset=>'Windows-1251');43. print start_html (-title => "Аптека", -bgcolor=>'wheat');44. print start_form(-action => url ());45. print p center h2 "Поиск заказов";46. $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});47. my $choice = param("choice");48. if ($choice eq ""){49. print p br, br, br, br;50. print p center h3 "Выберите значения, по которым будет производиться поиск";51. print p center checkbox_group (-name => "search_param",-values => ["id", "login"],52. -labels => \%search_param);53. print p center submit (-name => "choice",-value => "Выбрать");}54. elsif($choice eq "Выбрать"){55. @mas_param = param("search_param");56. show (\@field_list, \@mas_param);57. print p hidden (-name=>"search_param", -value=>"@mas_param");}58. elsif($choice eq "Поиск"){59. print p hr({-width => '100%'});60. my $count = 0;61. my $c = 0;62. my $inc_poisk = 0;63. my $preparati_poisk = 0;64. my $kolich_poisk = 0;65. my $sql = "";66. my @param = param("search_param");67. foreach my $i (@param){68. if (param("$i") ne ""){69. if ($sql eq ""){70. $sql .= " $i=" . "'" . param("$i") . "'";}71. else{

121

Page 122: Аптека_ДИПЛОМ.doc

72. $sql .= " AND $i=" . "'" . param("$i") . "'";}}}73. $sql = "SELECT * FROM zakaz WHERE " . $sql;74. my $sth = $dbh->prepare($sql);75. $sth->execute();

Продолжение приложения А

76. while (my $val = $sth->fetchrow_hashref()){77. my $sum = 0;78. my $sth = $dbh->prepare(qq(select * from user where login = '$val->{login}'));79. $sth->execute();80. my $st = $sth->fetchrow_hashref();81. print p font({-color=>'red', size=>'4'}, "Заказ № ", ++$count);82. print p h4 "ID номер заказа: ", u ($val->{id});83. print p h4 "Время внесения заказа: ", u ($val->{t});84. print p h4 "Логин закзчика: ", u ($val->{login});85. print p h4 "Фамилия, имя закзчика: ", u ($st->{famil}, $st->{name});86. print p h4 "Организация закзчика: ", u ($st->{organization});87. print p h4 "Телефон закзчика: ", u ($st->{telefon});88. print p h4 "e-mail закзчика: ", u ($st->{e_mail});89. $sth->finish();90. print p font({-color=>'blue', size=>'4'},"Заказано:");91. my @mas = split (/ /, $val->{preparati});92. my @mas_kol = split (/ /, $val->{kolich});93. $c = 0;94. foreach my $i (@mas){95. $sth = $dbh->prepare(qq(select * from preparati where id = '$i'));96. $sth->execute();97. $st = $sth->fetchrow_hashref();98. print p li (font({-color=>'blue'},99. "Сериный номер ", font({-color=>'green'}, $st->{serial}), ", ",100. "Название ", font({-color=>'green'}, $st->{name}), ", ",101. "Форма выпуска ", font({-color=>'green'}, $st->{forma}), ", ",102. "Производитель ", font({-color=>'green'}, $st->{proizvod}), ", ",103. "Фирма ", font({-color=>'green'}, $st->{firma}), ", ",104. "Цена = ", font({-color=>'green'}, $st->{opt_tsena}), ", ",105. "Количество ", font({-color=>'green'}, $mas_kol[$c])));106. $sum += $st->{opt_tsena} * $mas_kol[$c];107. $c++;}108. print p b "Итого сумма заказа = $sum тенге";109. print p hr({-width => '100%'});}110. print p center h2 "Данной информации нет в базе данных" if $c eq 0;111. $sth->finish();}112. $dbh->disconnect;113. print end_form();114. print end_html();115. exit(0);

Код скрипта poisk_user_admin.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my (@row, @mas_param, @list_id, %mas, @list_forma);8. my %search_param =(9. "id" => "ID",10. "serial" => "Серийный номер",11. "name" => "Название",12. "forma" => "Форма выпуска",13. "proizvod" => "Производитель",14. "firma" => "Фирма",15. "nomer_apteki" => "Номер апткеки",16. "tsena" => "Цена",17. "opt_tsena" => "Оптовая цена",18. "kartinka" => "Картинка");19. my @field_list =(20. { name => "id", label => "ID",size => 30},21. { name => "serial", label => "Серийный номер:",size => 30},22. { name => "name", label => "Название:",size => 30},23. { name => "forma", label => "Форма выпуска:",size => 30},24. { name => "proizvod", label => "Производитель:",size => 30},25. { name => "firma", label => "Фирма:",size => 30},26. { name => "nomer_apteki", label => "Номер аптеки:",size => 30},

122

Page 123: Аптека_ДИПЛОМ.doc

27. { name => "tsena", label => "Цена:",size => 30},28. { name => "opt_tsena", label => "Оптовая цена:",size => 30},29. { name => "kartinka", label => "Картинка:",size => 30});30. sub show{31. my $field_ref = shift;

Продолжение приложения А

32. my $search_param = shift;33. foreach my $f (@{$field_ref}){34. my $c;35. foreach my $i (@{$search_param}){36. $c = 1 if ($i eq $f->{name});}37. if ($c eq 1){38. my $label = $f->{label};39. if($f->{name} eq "forma"){40. push (@row,Tr (td ({-align => "left"}, "Форма выпуска",41. td ({-align => "left"}, popup_menu(-name=>'forma', -value=>\@list_forma)))));}42. elsif($f->{name} ne "nomer_apteki"){43. push (@row, Tr (td (escapeHTML($label),44. td (textfield (-name => $f->{name}, -size => $f->{size})))));}45. else{46. push (@row, Tr (td ({-align => "left"}, escapeHTML($label),47. td ({-align => "left"}, popup_menu(-name=>$f->{name},-value=>\@list_id,-labels=>\%mas)))));}}}48. print center table (@row),49. submit (-name => "choice", -value => "Поиск")," ",50. reset();}51. #main52. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});53. print header(-charset=>'Windows-1251');54. print start_html (-title => "Аптека", -bgcolor=>'powderblue');55. print start_form(-action => url ());56. print p br;57. print p center h2 "Поиск препаратов";58. print p hr ({-width => '50%'});59. my $choice = param("choice");60. if ($choice eq ""){61. @mas_param = param("poisk_param");62. if ($mas_param[0] ne ""){63. @list_forma = @{$dbh->selectcol_arrayref("SELECT * FROM forma")};64. my $sth = $dbh->prepare("SELECT id, nomer, gorod FROM apteki");65. $sth->execute();66. while (my $i = $sth->fetchrow_hashref()){67. push(@list_id, $i->{id});68. $mas{$i->{id}}="№" . $i->{nomer} . "г. " . $i->{gorod};}69. $sth->finish();70. show (\@field_list, \@mas_param);71. print p hidden (-name=>"search_param", -value=>"@mas_param");}72. else{73. print p center font({-color=>'red', -size=>'5'},"Вы не выбрали параметры поиска <br> Попробуйте снова");}}74. elsif ($choice eq "Поиск"){75. my $count;76. my $c = 0;77. my $sql = "";78. # my @param = param("search_param");79. my @param = split (/ /, param("search_param"));80. foreach my $i (@param){81. $c = 1 if param("$i") eq "";}82. if ($c ne 1){83. foreach my $i (@param){84. if (param("$i") ne ""){85. if ($sql eq ""){ 86. $sql .= " $i=" . "'" . param("$i") . "'";}87. else{88. $sql .= " AND $i=" . "'" . param("$i") . "'";}}}89. $sql = "SELECT * FROM preparati WHERE " . $sql;90. my $sth = $dbh->prepare(qq($sql));91. $sth->execute();92. $count = 0;93. while (my $val = $sth->fetchrow_hashref()){94. my @mas = split (/ /, $val->{nomer_apteki});95. my $str = "";96. foreach my $i (@mas){97. my $sth1 = $dbh->prepare(qq(select gorod, nomer, adres from apteki where id = '$i'));98. $sth1->execute();99. my $st = $sth1->fetchrow_hashref();100. $str .= "№" . $st->{nomer} . " (г. " . $st->{gorod} . ", адрес $st->{adres})" . "<br>" ;101. $sth1->finish();}

123

Page 124: Аптека_ДИПЛОМ.doc

102. push (@row,Tr(td(font({-color=>'blue'}), "Серийный номер: "),td($val->{serial})),103. Tr(td(font({-color=>'blue'}), "Название: "),td($val->{name})),104. Tr(td(font({-color=>'blue'}), "Форма выпуска: "),td($val->{forma})),105. Tr(td(font({-color=>'blue'}), "Производитель: "),td($val->{proizvod})),106. Tr(td(font({-color=>'blue'}), "Фирма: "),td($val->{firma})),

Продолжение приложения А

107. Tr(td(font({-color=>'blue'}), "Аптеки: "),td($str)),108. Tr(td(font({-color=>'blue'}), "Цена: "),td($val->{tsena}, " тенге")),109. Tr(td(font({-color=>'blue'}), "Внешний вид: "),td("<A href='$val->{kartinka}' target='_blank'>Показать</A>")),110. Tr(td({-colspan=>"2"},hr ())));111. ++$count;}112. $sth->finish();113. print p center table(@row);}114. else{115. print p center font({-color=>'red', -size=>'4'}, "Вы не заполнили все поля, попробуйте снова");}116. if ($count eq 0){117. print p center h2 "Данной информации нет в базе данных";}}118. $dbh->disconnect;119. print end_form();120. print end_html();121. exit(0);

Код скрипта show_apt_user.pl1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my @row;8. print header(-charset=>'Windows-1251');9. print start_html (-title => "Аптека", -bgcolor=>'powderblue');10. print start_form(-action => url ());11. print p br;12. print p center h2 "Список аптек";13. print p hr ({-width => '50%'});14. print p br, br;15. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});16. my $sth = $dbh->prepare(qq(select * from apteki));17. $sth->execute();18. my $count = 0;19. while (my $val = $sth->fetchrow_hashref()){20. push (@row,Tr(td(font({-color=>'blue'}), "Номер аптеки"),21. td(font({-color=>'red', -size=>'4'}), $val->{nomer})),Tr(22. td(font({-color=>'blue'}), "Адрес"),td($val->{adres})),23. Tr(td(font({-color=>'blue'}), "Телефон"),td($val->{telefon})),24. Tr(td(font({-color=>'blue'}), "Город"),td($val->{gorod})),25. Tr(td(font({-color=>'blue'}), "Расположение аптека"),26. td("<A href='$val->{map}' target='_blank'>Показать</A>")),27. Tr(td({-colspan=>"2"},hr ())));28. ++$count;}29. print center table ({-border => 0, width=>'30%'}, @row);30. $sth->finish();31. $dbh->disconnect;32. print end_form();33. print end_html();34. exit(0);

Код скрипта poisk_apt_user.pl

1. #!c:\perl\bin\perl2. use strict;3. use CGI qw(:all);4. use DBI;5. my $host="127.0.0.1";6. my $db_name="apteka";7. my (@row, @mas_param, @list);8. my @field_list =(9. { name => "nomer", label => "Номер:",size => 30},10. { name => "adres", label => "Адрес:",size => 30},11. { name => "telefon", label => "Телефон:",size => 30},12. { name => "gorod", label => "Город:",size => 30});13. sub show{14. my $field_ref = shift;15. my $search_param = shift;

124

Page 125: Аптека_ДИПЛОМ.doc

16. foreach my $f (@{$field_ref}){17. my $c;18. foreach my $i (@{$search_param}){19. $c = 1 if ($i eq $f->{name});}20. if ($c eq 1){21. my $label = $f->{label};

Продолжение приложения А

22. if($f->{name} ne "gorod"){23. push (@row, Tr (td (escapeHTML($label),24. td (textfield (-name => $f->{name}, -size => $f->{size})))));}25. else{26. push (@row, Tr (td ({-align => "left"}, escapeHTML($label),27. td ({-align => "left"}, popup_menu(-name=>$f->{name}, -value=>\@list)))));}}}28. print center table (@row),submit (-name => "choice", -value => "Поиск")," ",reset();}29. #main30. my $dbh = DBI->connect("DBI:mysql:host=$host;database=$db_name", "root", "flbkf", {PrintError => 0, RaiserError =>1});31. print header(-charset=>'Windows-1251');32. print start_html (-title => "Аптека", -bgcolor=>'powderblue');33. print start_form(-action => url ());34. print p br;35. print p center h2 "Поиск аптеки";36. print p hr ({-width => '50%'});37. my $choice = param("choice");38. if ($choice eq "Выбрать"){39. @mas_param = param("poisk_param");40. if ($mas_param[0] ne ""){41. @list = @{$dbh->selectcol_arrayref("SELECT name FROM city")};42. show (\@field_list, \@mas_param);43. print p hidden (-name=>"search_param", -value=>"@mas_param");}44. else{45. print p center font({-color=>'red', -size=>'5'},"Вы не выбрали параметры поиска <br> Попробуйте снова");}}46. elsif ($choice eq "Поиск"){47. my $sql = "";48. my @param = split (/ /, param("search_param"));49. foreach my $i (@param){50. if (param("$i") ne ""){51. if ($sql eq ""){52. $sql .= " $i=" . "'" . param("$i") . "'";}53. else{54. $sql .= " AND $i=" . "'" . param("$i") . "'";}}}55. $sql = "SELECT * FROM apteki WHERE " . $sql;56. my $sth = $dbh->prepare(qq($sql));57. $sth->execute();58. my $count = 0;59. while (my $val = $sth->fetchrow_hashref()){60. push (@row,Tr(61. td(font({-color=>'blue'}), "Номер аптеки"),td(font({-color=>'red', -size=>'4'}), $val->{nomer})),62. Tr(td(font({-color=>'blue'}), "Адрес"),td($val->{adres})),63. Tr(td(font({-color=>'blue'}), "Телефон"),td($val->{telefon})),64. Tr(td(font({-color=>'blue'}), "Город"),td($val->{gorod})),Tr(65. td(font({-color=>'blue'}), "Расположение аптека"),66. td("<A href='$val->{map}' target='_blank'>Показать</A>")),Tr(td({-colspan=>"2"},hr ()))67. );68. ++$count;}69. if ($count ne 0){70. print center table ({-border => 0}, @row);71. print center p b ("Всего аптек: " . $count);}72. else{73. print p center h2 "Данной информации нет в базе данных";}74. $sth->finish();}75. $dbh->disconnect;76. print end_form();77. print end_html();78. exit(0);

Код файла index.html

1. <html><head>2. <title>Главная страница</title>3. <frameset rows="15%,90%" border=0>4. <frame src="up.html" scrolling="no" noresize name="up">5. <frameset cols="15%,85%">6. <frame src="left.html" scrolling="auto" name="left">7. <frame src="right.html" scrolling="auto" name="right">8. </frameset></frameset>

125

Page 126: Аптека_ДИПЛОМ.doc

9. </head></html>

Код файла admin.html1. <html><head>2. <title>Admin</title>3. <frameset cols="15%,85%" border=0>4. <frame src="up_admin.html" scrolling="no" noresize name="up">

Продолжение приложения А

5. <frame src="down_admin.html" scrolling="auto" name="down">6. </frameset></head></html>

Код файла company.html1. <html><head>2. <title>diplom</title></head>3. <body bgcolor="powderblue">4. <center>5. <h2>О компании "Jan Farma"</h2><br><br></center>6. <table border=0><tr><td><img src="/img/company.jpg"><td><td><p>7. Наша компания является лидером среди казахстанских 8. компании занимающихся фармацевтическим бизнессом.9. Наши квалифициоранные специалисты предлагают вам следующие услуги:<br>10. <ul><li>Продажа качественных медицинских препаратов</li>11. <li>Поставка препаратов на заказ</li>12. <li>Проведение специализированных консультаций</li></ul>13. Кампания "Jan Farma" имеет собственные аптеки, которые расположены во всех крупных городах Казахстана.14. Информацию о наших аптеках и имеющихся в них препаратов вы можете найти на данном сайте. 15. Также имеется возможность провести заказ препаратов, пройдя регистрацию на нашем сайте, 16. все заказы оперативно обрабатываются нашими операторами.17. <br><br><font color=blue>18. Наш адрес: город Алматы, улица Кайырханова 1<br>19. Телефоны: (83272)777777, 888888</font></p></td></tr></table></body></html>

Код файла down_admin.html

1. <html><head>2. <title>down_admin</title></head>3. <body bgcolor="wheat"><br><br><br><br><center>4. <h2>Администрирование</h2><hr width=50%></center></body></html>

Код файла up_admin.html

1. <html><head>2. <title>up_admin</title></head>3. <body bgcolor="wheat"><br><table border=0 width=80%><tr>4. <td><A href="../cgi-bin/show_city.pl" target="down">Промотреть города</A></td>5. </tr><tr>6. <td><A href="../cgi-bin/add_city.pl" target="down">Добавить город</A></td></tr>7. <tr><td><A href="../cgi-bin/del_city.pl" target="down">Удалить город</A></td></tr>8. <tr><td><hr></td></tr><tr>9. <td><A href="../cgi-bin/show_aptek.pl" target="down">Просмотреть аптеки</A></td></tr><tr>10. <td><A href="../cgi-bin/add_aptek.pl" target="down">Добавить аптеку</A></td></tr>11. <tr>12. <td><A href="../cgi-bin/korekt_aptek.pl" target="down">Корректировать</A></td></tr>13. <tr><td><A href="../cgi-bin/del_aptek.pl" target="down">Удалить аптеку</A></td>14. </tr><tr>15. <td><A href="../cgi-bin/poisk_aptek.pl" target="down">Поиск аптеки</A></td></tr><tr>16. <td><hr></td></tr><tr>17. <td><A href="../cgi-bin/show_prepar.pl" target="down">Просмотрет 18. препараты</A></td>19. </tr><tr>20. <td><A href="../cgi-bin/add_prepar.pl" target="down">Добавить препараты</A></td>21. <tr>22. <td><A href="../cgi-bin/korekt_prepar.pl" target="down">Корректировать</A></td>23. </tr><tr>24. <td><A href="../cgi-bin/del_prepar.pl" target="down">Удалить препараты</A></td>25. </tr><tr>26. <td><A href="../cgi-bin/poisk_prepar.pl" target="down">Поиск препаратов</A></td>27. </tr><tr>28. <td><hr></td></tr><tr>29. <td><A href="../cgi-bin/show_user.pl" target="down">Просмотреть пользователей</A></td></tr><tr>30. <td><A href="../cgi-bin/korekt_userr.pl" target="down">Корректировать</A></td>

126

Page 127: Аптека_ДИПЛОМ.doc

31. </tr><tr>32. <td><A href="../cgi-bin/del_user.pl" target="down">Удалить пользователя</A></td>33. </tr><tr>34. <td><A href="../cgi-bin/poisk_puser.pl" target="down">Поиск пользователя</A></td>35. </tr><tr><td><hr></td></tr><tr>36. <td><A href="../cgi-bin/show_zakaz.pl" target="down">Просмотреть заказы</A></td></tr><tr>37. <td><A href="../cgi-bin/poisk_zakaz.pl" target="down">Поиск заказа</A></td>

Продолжение приложения А

38. </tr><tr>39. <td><A href="../cgi-bin/del_zakaz.pl" target="down">Удалить заказ</A></td></tr></table></body></html>

Код файла left.html

1. <html><head><title>left</title></head>2. <body bgcolor="powderblue">3. <font color="blue" size=3>Информация для торговых представителей</font>4. <br><br><br><h3>Новости</h3></body></html>

Код файла poisk.html

1. <html><head><title>diplom</title></head>

2. <body bgcolor="wheat">

3. <center><h2>Поиск</h2></center></body></html>

Код файла poisk_apt_user.html

1. <html><head><title>up_admin</title></head><body bgcolor="powderblue">2. <br><center><h2>Поиск аптеки</h2><hr width=60%>3. <form method="post" action="../cgi-bin/poisk_apt_user.pl"><br>4. <h3>Выберите параметры, по которым будет производиться поиск и нажмите кнопку</h3><br>5. <table border=0><tr><td></td>6. <td rowspan=6><img src="/img/apt.jpg"></td>7. <td><input type="checkbox" name="poisk_param" value="name"></td>8. <td>Название</td></tr><tr><td></td>9. <td><input type="checkbox" name="poisk_param" value="nomer"></td><td>Номер</td>10. </tr><tr><td></td>11. <td><input type="checkbox" name="poisk_param" value="adres"></td><td>Адрес</td>12. </tr><tr><td></td>13. <td><input type="checkbox" name="poisk_param" value="telefon"></td>14. <td>Телефон</td></tr><tr><td></td>15. <td><input type="checkbox" name="poisk_param" value="gorod"></td><td>Город</td>16. </tr></table><br><input type="submit" value="Выбрать" name="choice">17. <input type="reset" value="Отменить"></center></form></body></html>

Код файла poisk_ user.html

1. <html><head><title>up_admin</title></head><body bgcolor="powderblue"><br>2. <center><h2>Поиск препаратов</h2><hr width=50%>3. <form method="post" action="../cgi-bin/poisk_user.pl"><br>4. <h3>Выберите параметры, по которым будет производиться поиск и нажмите кнопку</h3><br><table border=0><tr><td></td>5. <td rowspan=6><img src="/img/lekarstva1.jpg"></td>6. <td><input type="checkbox" name="poisk_param" value="name"></td>7. <td>Название</td></tr><tr><td></td>8. <td><input type="checkbox" name="poisk_param" value="forma"></td>9. <td>Форма выпуска</td></tr><tr><td></td>10. <td><input type="checkbox" name="poisk_param" value="proizvod"></td>11. <td>Производитель(страна)</td></tr><tr><td></td>12. <td><input type="checkbox" name="poisk_param" value="firma"></td>13. <td>Фирма</td></tr><tr><td></td>14. <td><input type="checkbox" name="poisk_param" value="tsena"></td>15. <td>Цена</td></tr><tr><td></td>16. <td><input type="checkbox" name="poisk_param" value="nomer_apteki"></td>17. <td>Номер аптеки</td></tr>18. <tr><td></td>19. <td colspan=3 align=right><input type="submit" value="Выбрать">20. <input type="reset" value="Отменить"></td><td></td>

127

Page 128: Аптека_ДИПЛОМ.doc

21. </tr></table></center></form></body></html>

Код файла right.html

1. <html><head><title>right</title></head>2. <body bgcolor="powderblue"><center><br>

Продолжение приложения А

3. <h2>Web - приложение АИС "Аптека"</h2><br>4. <h3>Выполнили студенты группы КСУ 01-4: Имашев А. и Кайырханов Ж. </h3><br>5. <h3>Руководитель Жумагалиев Б.И.</h3><br></center></body></html>

128