Содержание
Введение……………….………………………………………………………...
1 Web-приложение «Сайт системы научных конференций»....…………........
1.1 Анализ требований………………………………………….…................
1.1.1 Анализ предметной области…………………...................................
1.1.2 Анализ функциональных требований………....................................
1.1.3 Анализ требований к интерфейсу пользователя...............................
1.1.4 Выбор технологий и инструментальных программных средств....
1.2. Проектирование……………………………….........................................
1.2.1 Проектирование структуры данных……………………………......
1.2.2 Проектирование структуры программного обеспечения и алгоритмов.........................................................................................
1.2.3 Проектирование пользовательского интерфейса..............................
1.3 Реализация……………………………………...........................................
1.3.1 Программная реализация...................................................................
1.3.2 Кодирование…………….....................................................................
1.4 Тестирование…………………………………...........................................
Заключение…………………………………………………………..…………..
Список использованных источников………………………………..…………
Приложение А. Код приложения ……………………….......……….………...
Приложение Б. Результаты тестирования……………..………………………
|
5
6
6
6
7
10
11
12
12
14
16
18
18
18
20
21
22
23
55
|
Введение
Постоянно растущие требования к сайтам в сети Интернет способствуют внедрению новых технологий. Переломным моментом в сайтостроении можно считать начало применения скриптовых языков программирования, позволяющих создавать динамические, легко обновляющиеся сайты, и в полной мере реализовывать интерактивное общение с пользователем.
Одним из таких языков является Perl (Practical Extraction and Report Language) — это мощное средство для создания командных сценариев, которые могут использоваться для файловых операций, создания отчётов и выполнения множества других задач.
Изначально Perl задумывался как высокоуровневый кросс-платформенный язык системного программирования. Perl вышел далеко за пределы исходного предназначения, но он продолжает широко использоваться в системном программировании в родных системах семейства UNIX и на других платформах. [2]
Одним из главных преимуществ Perl как языка веб-программирования является мощный инструментарий для обработки текстовой информации и, в частности, поддержка регулярных выражений. Именно она в первую очередь способствует успешному применению языка Perl для создания приложений CGI.
CGI (Common Gateway Interface) — стандарт интерфейса, используемого для связи внешней программы с веб-сервером. Программу, которая работает по такому интерфейсу совместно с веб-сервером, принято называть шлюзом, хотя многие предпочитают названия «скрипт» (сценарий) или «CGI-программа». [2]
Сам интерфейс разработан таким образом, чтобы можно было использовать любой язык программирования, который может работать со стандартными устройствами ввода/вывода. [2]
Цель данной курсовой работы — разработка интернет-магазина , который упрощает покупку необходимых товаров.
В качестве средств для реализации поставленной задачи были выбраны: веб-сервер Apache, sql-сервер MySQL и языки программирования Perl и JavaScript.
Web-приложение «Интернет магазин часов»
1.1Анализ требований
1.1.1Анализ предметной области
В рамках данного курсового проекта разработано Web-приложение «Интернет-магазин часов».
Приложение актуально для пользователей Интернета, которые могут посмотреть информацию об интересующем товаре, а также осуществить его заказ
Администратор данного приложения может вносить изменения, добавляя в базу данных необходимую информацию.
Вся информация на сайте считывается из БД построчно, либо по запросам. Обращение к БД реализуется в CGI- программах.
Основное назначение CGI-программы состоит в выполнении трех нижеследующих этапов:
- получение и декодирование запроса пользователя;
- обработка запроса лично или путем обращения к другим CGI-программам или прикладным программным продуктам;
- генерация результирующей HTML-формы и пересылка ее пользователю.
CGI-программы получили широкое распространение потому, что их использование позволяет генерировать HTML-документы “на лету”, что избавляет от необходимости хранить все возможные варианты ответов в дисковой памяти. Взаимодействие браузера, Web-сервера и CGI-программы осуществляется в соответствии с протоколом HTTP.
В нашем приложении выделяются 2 основных категории:
—ПОЛЬЗОВАТЕЛЬ
—АДМИНИСТРАТОР
Краткое описание основных действующих лиц представлено в таблице 1.
Таблица 1 - Действующие лица.
Название |
Профиль, подготовка и навыки |
ПОЛЬЗОВАТЕЛЬ |
Обычный пользователь. Может просматривать размещённую на сайте информацию о товарах представленных магазином. Может осуществлять заказ необходимой продукции. Использует возможности графического интерфейса приложения. Требуются базовые навыки работы с ПК. |
АДМИНИСТРАТОР |
Человек, занимающийся поддержанием работы сайта. Может просматривать и редактировать размещённую на сайте информацию о товарах и услугах, может добавлять новый товар, редактировать характеристики, просматривать статистические данные. Использует возможности графического интерфейса приложения. Требуются средние навыки работы с ПК. |
1.1.2Анализ функциональных требований
В соответствии с требованиями к осуществляемым Web-приложением функциям можно отнести следующие:
—просмотр списка моделей часов;
—подбор часов по параметрам;
—просмотр информации о фирмах;
—добавление выбранного товара в корзину;
—оформление заказа;
—добаление фирм;
—добавление новых моделей часов;
—редактирование информации о фирмах;
—редактирование параметров часов;
—удаление невостребованных моделей часов из базы;
—просмотр сведений о заказах;
—авторизация администратора.
Краткое описание основных вариантов использования разрабатываемого приложения представлено в таблице 2.
Таблица 2 – Краткое описание основных вариантов использования.
Действующее лицо |
Цель |
Краткое описание |
ПОЛЬЗОВАТЕЛЬ, АДМИНИСТРАТОР |
Просмотреть список моделей часов |
Пользователь просматривает список моделей часов, знакомится с характеристиками. |
ПОЛЬЗОВАТЕЛЬ, АДМИНИСТРАТОР |
Подбор часов по параметрам |
Пользователь вводит в форму параметры необходимые ему для подбора часов и получает результат. |
ПОЛЬЗОВАТЕЛЬ, АДМИНИСТРАТОР |
Просмотр информации о фирмах |
Пользователь просматривает информацию о фирмах производителях часов, их особенности и исторические аспекты. |
ПОЛЬЗОВАТЕЛЬ, АДМИНИСТРАТОР |
Добавление выбранного товара в корзину |
Пользователь, выбрав наиболее подходящие для него часы может добавить их в корзину для дальнейшей покупки. |
АДМИНИСТРАТОР |
Добаление фирм |
Администратор добавляет в базу новые фирмы – производители часов. |
АДМИНИСТРАТОР |
Добавление новых моделей часов |
Администратор добавляет в базу новые модели часов. |
АДМИНИСТРАТОР |
Редактирование информации о фирмах |
Администратор редактирует информацию о фирмах. |
АДМИНИСТРАТОР |
Редактирование параметров часов |
Администратор редактирует в характеристиках часов необходимые параметры. |
АДМИНИСТРАТОР |
Удаление невостребованных моделей часов из базы |
Администратор удаляет фирмы и модели часов, которые по каким-либо причинам стали ненужными. |
АДМИНИСТРАТОР |
Просмотр сведений о заказах |
Администратор просматривает информацию о продажах |
АДМИНИСТРАТОР |
Авторизация и деавторизация |
Авторизация администратора перед работой с приложением |
На основании таблицы 2 можно создать начальную диаграмму вариантов использования для разрабатываемого ПО, включающую основные действия пользователя. Она представлена на рисунке 1.
Рисунок 1 – Диаграмма вариантов использования
1.1.3Анализ требований к интерфейсу пользователя
Из требований к интерфейсу можно выделить следующие:
— должны присутствовать текст, рисунок, фоновый рисунок, желательно наличие таблиц;
— внутри страницы должен быть обеспечен переход по ссылкам — на начало страницы, в конец страницы, по тематическим разделам и элементам списка рисунков, возврат на главную страницу.
Эти требования реализуются средствами стандартного языка разметки Web-документов HTML.
1.1.4Выбор технологий и инструментальных программных средств
В связи с тем, что пользователи должны иметь возможность использовать разрабатываемое программное обеспечение как в операционных системах WindowsNT, так и в Unix-подобных системах, необходимо обеспечить кроссплатформенность и доступность разрабатываемой системы. Для удовлетворения этих требований было принято решение реализовать систему в виде веб-приложения.
Веб-приложение – клиент-серверное приложение, в котором клиентом выступает браузер, а сервером – веб-сервер. Логика веб-приложения распределена между этими элементами, поэтому необходимо рассмотреть отдельно средства реализации для клиента и сервера.
Логика приложения на стороне клиента будет реализована стандартными средствами: HTML, CSS и Javascript. Эти средства выбраны, поскольку они поддерживаются всеми браузерами и операционными системами, в отличие от Flash, Java-апплетов и других технологий.
В связи со сложностью приложения, его логику на стороне сервера было решено реализовать с использованием двухуровневой архитектуры программного обеспечения.
Для хранения пользовательских данных будет использован MySQL-сервер. Этот сервер является бесплатным и предоставляет все необходимые средства для хранения и обработки пользовательских данных.
В качестве веб-сервера выбран Apache, поскольку он является одним из самых надежных и гибких в конфигурации. Одним из преимуществ данного сервера является модульность и расширяемость.
Для реализации серверной части приложения был выбран язык программирования Perl. CGI-сценарии на языке Perl, генерирующие HTML-страницы «на лету» являются мощным средством для решения поставленной задачи.
1.2Проектирование
1.2.1Проектирование структур данных
Основной структурой данных является база данных, в которой содержится информация о фирмах, моделях часов, продажах, счетах и типах механизма и крепления. Всего в базе данных существует семь таблиц. Их описание представлено ниже.
Таблица 3 — описание таблицы firma(фирмы)
Имя столбца |
Содержательное наполнение |
Тип данных |
Роль |
id |
Идентификатор фирмы |
int(2) |
Первичный ключ |
Name_Firma |
Название фирмы |
varchar(15) |
Атрибут |
Country |
Страна производитель |
varchar(30) |
Атрибут |
Logos |
Логотип фирмы |
varchar(50) |
Атрибут |
Resume |
Информация о фирме |
text |
Атрибут |
Таблица 4 — описание таблицы model (модели)
Имя столбца |
Содержательное наполнение |
Тип данных |
Роль |
id |
Идентификатор модели |
int(2) |
Первичный ключ |
id_Firma |
Идентификатор фирмы |
int(2) |
Внешний ключ |
Name_Model |
Название модели |
varchar(40) |
Атрибут |
id_Mechanism |
Идентификатор механизма |
int(1) |
Внешний ключ |
id_Kreplen |
Идентификатор крепления |
int(1) |
Внешний ключ |
id_Pol |
Идентификатор пола |
int(1) |
Внешний ключ |
Data_post |
Дата поставки |
date |
Атрибут |
Price |
Стоимость |
int(7) |
Атрибут |
Photo |
Изображение |
varchar(50) |
Атрибут |
Таблица 5 — описание таблицы mechanism(типы механизмов)
Имя столбца |
Содержательное наполнение |
Тип данных |
Роль |
id |
Идентификатор механизма |
int(1) |
Первичный ключ |
name |
Название механизма |
varchar(20) |
Атрибут |
Таблица 6 — описание таблицы kreplen (типы крепления)
Имя столбца |
Содержательное наполнение |
Тип данных |
Роль |
id |
Идентификатор крепления |
int(1) |
Первичный ключ |
name |
Название крепления |
varchar(10) |
Атрибут |
Таблица 7 — описание таблицы pol (пол)
Имя столбца |
Содержательное наполнение |
Тип данных |
Роль |
id |
Идентификатор пола |
int(1) |
Первичный ключ |
name |
Название пола |
varchar(10) |
Атрибут |
Таблица 8 — описание таблицы schet (счет)
Имя столбца |
Содержательное наполнение |
Тип данных |
Роль |
id |
Идентификатор счета |
nt(10) |
Первичный ключ |
nom |
Номер счета |
varchar(255) |
Атрибут |
fio |
ФИО покупателя |
varchar(255) |
Атрибут |
tel |
Телефон покупателя |
varchar(255) |
Атрибут |
email |
Email покупателя |
varchar(255) |
Атрибут |
data |
Дата и время совершения заказа |
datetime |
Атрибут |
Таблица 9 — описание таблицы sale (продажи)
Имя столбца |
Содержательное наполнение |
Тип данных |
Роль |
id |
Идентификатор продажи |
int(10) |
Первичный ключ |
id_Model |
Идентификатор модели |
int(10) |
Внешний ключ |
Schet_id |
Идентификатор счета |
int(10) |
Внешний ключ |
Проектирование базы данных осуществлялось с помощью методологии IDEF1X, которая специально разработана для построения реляционных информационных систем.
На рисунке 2 приведена логическая модель базы данных.
Рисунок 2 – Диаграмма логической модели базы данных
1.2.2Проектирование структуры программного обеспечения и алгоритмов
В процессе проектирования информационной системы были использованы следующие модули языка Perl:
DBI — библиотека, осуществляющая работу с базами данных. Эта библиотека независима от типа БД. В данной работе используется СУБД MySQL, и для взаимодействия с ней модуль DBI использует класс DBD::MySQL.
CGI — данный модуль содержит набор функций для создания HTML-документов.
Оба модуля входят в состав ActivePerl 5.10.1.
Рассмотрим взаимодействие основных компонентов разрабатываемого web-приложения.
При загрузке сайта пользователь в первую очередь попадает на главную страницу. При выборе одного из пунктов меню запускается соответствующий cgi-скрипт для вывода необходимой информации.
Диаграмма деятельности - диаграмма, на которой показано разложение некоторой деятельности на её составные части. Под деятельностью (англ. activity) понимается спецификация исполняемого поведения в виде координированного последовательного и параллельного выполнения подчинённых элементов — вложенных видов деятельности и отдельных действий (англ. action), соединённых между собой потоками, которые идут от выходов одного узла ко входам другого. [4]
В курсовой работе диаграмма деятельности предназначена для детализации особенностей алгоритмической и логической организации системы.
Диаграмма деятельности редактирования продукции представлена ниже на рисунке 3.
Рисунок 3 — Диаграмма деятельности
Диаграмма последовательности - это диаграмма, чаще всего, описывающая один сценарий приложения. На диаграмме изображаются экземпляры объектов и сообщения, которыми они обмениваются в рамках одного прецедента (use case). Рассмотрим диаграмму последовательности для варианта использования «Просмотр списка всех моделей часов».
Пользователь выбирает пункт меню «Все модели» смотрит информацию о часах.
На рисунке 4 изображена диаграмма последовательности, которая показывает взаимодействие основных частей системы при просмотре списка моделей часов.
Рисунок 4 — Диаграмма последовательности
1.2.3Проектирование пользовательского интерфейса
Особенностью пользовательского интерфейса данной системы является простота и логичность. Страница веб-сайта с помощью средств html разделена на блоки . В верхней части располагается логотип интернет магазина. В правой части располагается ссылка на корзину в пользовательской части сайта и ссылка выхода из подсистемы в администраторской части.
В левой части располагается меню навигации по сайту, благодаря которой можно переходить в разные разделы приложения. В центральной части располагается основная часть приложения где отображается вся информация и все необходимые формы.
Благодаря такой структуре все страницы сайта имеют единый интерфейс, и пользователю будет значительно проще ориентироваться при переходе на другие страницы.
В соответствии с требованиями к интерфейсу пользователя были спроектированы веб-страницы, реализующие необходимые функции системы.
Основные веб-страницы сайта:
Администраторская часть:
•Главная страница сайта;
•Страница списка фирм с функциями добавления , редактирования и удаления записей;
•Страница списка моделей часов с функциями добавления , редактирования и удаления записей;
•Страница просмотра информации о заказах;
•Страница авторизации администратора;
Пользовательская часть:
•Главная страница;
•Страница со всеми моделями часов;
•Страница подбора часов по параметрам;
•Страница просмотра информации о фирмах;
•Страница корзины;
Одну из страниц сайта (главная пользовательская) можно увидеть на рисунке 5.
Рисунок 5 — Главная страница пользовательской части сайта
1.3Реализация
1.3.1Программная реализация
Данная система разрабатывалась на языке Perl с использованием веб-сервера Apache и sql-сервера MySQL. MySQL был выбран в качестве веб-сервера, потому что подходит для решения малых задач, имеет достаточную гибкость, а также является бесплатным.
Приложение использует клиент-серверную технологию. В качестве клиента выступает браузер пользователя, в качестве сервера – совокупность программно-аппаратных средств, необходимых для работы разработанной системы. На стороне клиента используется браузер, а на стороне сервера веб-сервер Apache, СУБД MySQL и CGI-программа на языке Perl. Диаграмма развертывания представлена на рисунке 6.
Рисунок 6 — Диаграмма развёртывания системы
1.3.2Кодирование
Программа, реализованная в данном проекте, включает в себя следующие файлы:
- Пользовательская часть:
- Index.pl – основной скрипт
- Ind.pl – главная страница сайта
- All_model – скрипт для вывода всех моделей часов магазина
- Model_find – скрипт для подбора модели часов по параметрам
- Firms.pl – отображает информацию о фирмах
- Index.html – определяет расположение компонентов страницы
- Setup.inf – хранит данные для подключения к базе данных
- Basket.pl – отображает страницу для работы с содержимым корзины и отправки заявки на товар
- Kvit.pm – модуль для отображения сгенерированной квитанции
- Site.js – реализует функции для работы с корзиной
- Администраторская часть:
- Admin.pl – основной скрипт админки
- Ind.pl – главная страница администраторской части сайта
- Firma.pl – страница для добавления и редактирования фирм
- Model.pl – страница для редактирования и бобавления новых моделей в базу
- Sale.pl – просмотр статистики заказов
- Admin.html – определяет расположение компонентов страницы
Полностью программный код приведён в приложении А.
1.4Тестирование
План тестирования представлен в таблице 9.
Таблица 9. План тестирования
Вариант использования |
Действие |
Что ожидаем |
Итог |
Авторизоваться на администраторской части сайта |
Пользователь вводит неверный пароль и логин |
Сообщение об ошибке |
Страница ввода пароля приняла начальный вид, вывелось сообщение «Не верно» Рис Б-1 |
Авторизоваться на администраторской части сайта |
Корректный ввод данных |
Заходим на главную страницу сайта |
После ввода аутентификационных данных вошли на главную страницу.
Рис Б-2
|
Добавить новую модель часов |
Корректный ввод данных |
Добавление данных |
Вывелось сообщение «Запись добавлена», при просмотре моделей видим добавленную модель Рис Б-3
Рис Б-4
|
Редактировать параметры часов |
Корректный ввод данных |
Изменение данных |
Вывелось сообщение «Запись отредактирована», параметры часов изменены Рис Б-5, Рис Б-6, Рис Б-7 |
Удалить выбранную модель часов |
Выбираем конкретную модель, нажимаемна кнопку. |
Данные удалены |
Вывелось сообщение «Запись удалена» из списка пропала модель, еоторую мы удалили Рис Б-8, Рис Б-9 |
Поиск часов по параметрам |
Вводим в поля для запроса некорректные данные или параметры отсутствующие в базе |
Программа ничего не подберет |
Вывелось пустое окно с надписью «Извините, но по данным параметрам ничего подобрать не получилось» |
Поиск часов по параметрам |
Вводим в поля корректные данные |
Программа выведет список часов |
Программа вывела список часов с указанными в запросе характеристиками
Рис Б-10, Рис Б-11
|
Добавить в корзину |
Выбираем необходимую модель часов и нажимаем на кнопку |
Товар занесен в корзину |
Добавленный товар в корзине есть
Рис Б-12, Рис Б-13
|
Отправляем запрос на товар |
Вводим обязательные поля и нажимаем кнопку |
Вывод квитанции |
Выводится квитанция с данными о покупке и заказчике |
Скриншоты тестирования приведены в приложении Б.
Заключение
В данной курсовой работе были выполнены анализ требований, проектирование и реализация программных средств, реализующих необходимые функции. В результате выполнения курсовой работы разработано Web-приложение интернет-магазин наручных часов, предоставляющий функции:
—поиск товара по параметрам;
—добавление товара в корзину;
—запрос на заказ товаров;
В процессе проектирования информационной системы была построена ее концепция, были выделены основные действующие лица. Проведен анализ вариантов использования. Разработаны модель предметной области. Были выбраны отдельные алгоритмы и описано их поведение диаграммами деятельности и последовательности.
Проект информационной системы разработан средствами СУБД MySQL. Приложение клиента реализовано с использованием языка Perl. На основе анализа полученных результатов можно сделать вывод, что все функции разработанной информационной системы работают корректно на всех наборах тестовых данных. Следовательно, цель курсового проектирования достигнута.
Список использованных источников
1.Фаулер М., Скотт К. «UML в кратком изложении. Применение стандартного языка объектного моделирования. » – М.: «Мир», 1999.
2.Матросов А.В., Чаунин М.П. «Самоучитель Perl» — СПб: «БХВ — Санкт-Петербург», 2000.
3.Кристиансен Т., Торкингтон Н. «Perl: библиотека программиста» — СПб: «Питер», 2001.
4.Браун М., Ханникат Д. «HTML 3.2 в подлиннике» — СПб: «БХВ — Санкт-Петербург», 2002.
5.Флэнаган Д. «JavaScript. Подробное руководство, 5-е издание» - СПб-М: «Символ-Плюс», 2008.
6.ГудманД. «JavaScript и DHTML. Сборник рецептов. Для профессионалов» — СПб: «Питер», 2004.
7.Мартин Браун. Perl. Архив программ. – М.: «Издательство БИНОМ», 2001.
8.Кольчугина Е.А. Программирование в сетях. Методические указания к выполнению лабораторных работ – Пенза, ПГУ, 2003.
Приложение А
(обязательное)
Код приложения
Администраторская часть
Admin.html
<HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Система управления сайтом</title>
<meta name="description" content="">
<meta name="keywords" con22:00 22.12.2009tent="">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<link rel="STYLESHEET" type="text/css" href="css/admin.css">
<link rel="stylesheet" href="/css/ui.all.css" type="text/css" media="all" />
<SCRIPT language=JavaScript src="/js/jquery-1.2.6.pack.js"></SCRIPT>
<script src="/js/ui.datepicker.js" type="text/javascript"></script>
<script type="text/javascript" src="/admin/js/admin.js"></script>
</head>
<body>
<center>
<table width="1002" cellspacing="0" cellpadding="0" border="0">
<td width="7" nowrap style="background: url(images/fon01.gif) repeat-y;"></td>
<td width="200" height="180" bgcolor="black" align="center">
<a href="/admin/"><img src="images/watch-img.jpg" width="143" height="180" vspace=3 border="0" alt="DATA"></a>
</td>
<td width="800" bgcolor="#330000" valign="top">
<table width="100%" cellspacing="0" cellpadding="0" border="0">
<td bgcolor="#324D44" height="130" align="center"><font color="#00FFFF" size="8" face="DigifaceWide">Shop of hours</font>
</td>
<tr>
<td valign='top' width="100%">
<table width="100%" height="57" cellspacing='0' cellpadding='0' border='0' >
<tr valign='top'>
<td width="6" nowrap></td>
<td valign='center' width="450" class="itlogo"><font color="#00CC33">АДМИНИСТРАТОРСКАЯ ЧАСТЬ САЙТА</font></td>
<td width="1" bgcolor="#324D44"></td>
<td width="150" class="white" valign="center" align="center"><a href="#" onclick="javascript: document.exit.submit(); return false;"><font color="#00CC33">Выход из Системы</font></a></td>
<form style="display: none" method="POST" action="" id="exit" name="exit"><input type="hidden" name="action" value="loginadm_end"></form>
</tr>
</table>
</td>
</table>
</td>
</table>
<table width="1002" cellspacing="0" cellpadding="0" border="0">
<tr>
<td width="206" nowrap valign="top" style="background: url(images/fon01.gif) right repeat-y;">
<table width="100%" cellspacing='0' cellpadding='0' border='0' bgcolor="#000000">
<tr>
<td width="7" nowrap style="background: url(images/fon01.gif) repeat-y;"></td>
<td width="100%" align="right">
<table width="192" cellspacing='0' cellpadding='0' border='0'>
<tr height="26">
<td width="100%" style="background: url(images/menu_header.jpg) no-repeat; padding-left:25px;" class="title_catalog">Меню</td>
</tr>
</table>
<table width="192" cellspacing='0' cellpadding='0' border='0'>
<tr height="26">
<td width="4" nowrap></td>
<td width="100%">
<br>
<table height="40" width='100%' border='0' cellspacing='0' cellpadding='0'>
<tr>
<td style='border-bottom: #e6e6e6 1px solid;'><img src='images/square_or.gif' width='15' height='9' border='0' alt=''></td>
<td width='100%' style='border-bottom: #e6e6e6 1px solid;'><a href='?act=firma' class='menu' style='line-height:180%;'><font color="#ffffff">Фирма производитель</font></a></td>
</tr>
</table>
<br>
<table height="40" width='100%' border='0' cellspacing='0' cellpadding='0'>
<tr>
<td style='border-bottom: #e6e6e6 1px solid;'><img src='images/square_or.gif' width='15' height='9' border='0' alt=''></td>
<td width='100%' style='border-bottom: #e6e6e6 1px solid;'><a href='?act=model' class='menu' style='line-height:180%;'><font color="#ffffff">Модели часов</font></a></td>
</tr>
</table>
<br>
<table height="40" width='100%' border='0' cellspacing='0' cellpadding='0'>
<tr>
<td style='border-bottom: #e6e6e6 1px solid;'><img src='images/square_or.gif' width='15' height='9' border='0' alt=''></td>
<td width='100%' style='border-bottom: #e6e6e6 1px solid;'><a href='?act=sale' class='menu' style='line-height:180%;'><font color="#ffffff">Заказы</font></a></td>
</tr>
</table>
</td>
<td width="4" nowrap></td>
</tr>
</table>
<table width="192" cellspacing='0' cellpadding='0' border='0'>
<tr height="18">
<td width="100%" style="background: url(images/fon07.jpg) no-repeat;"></td>
</tr>
</table>
</td>
</tr>
</table>
<table width="100%" cellspacing='0' cellpadding='0' border='0'>
<tr height="55">
<td width="7" nowrap style="background: url(images/fon01.gif) repeat-y;"></td>
<td width="100%" align="center" style="padding-top:30px;" bgcolor="#000000">© Kino</td>
</tr>
</table>
<table width="100%" cellspacing='0' cellpadding='0' border='0'>
<tr height="8">
<td width="100%" style="background: url(images/fon08.gif) right no-repeat;"></td>
</tr>
</table>
</td>
<td width="1" nowrap bgcolor="#979797"></td>
<td width="100%" bgcolor="#CCFFFF" style="padding-top:3px;padding-bottom:3px;padding-right:3px;border: #146492 solid; border-width: 1px 0px 0px 0px;" valign="top">
<!-- Content -->
<div style="margin: 0 10 0 10">
<div style=" font-size:13px; font-weight:bold"><TMPL_IF title><TMPL_VAR NAME=title></TMPL_IF></div>
<div style=" font-size:11px; font-weight:bold; color:#999999; margin-bottom:20px;"><TMPL_IF title2><TMPL_VAR NAME=title2></TMPL_IF></div>
<TMPL_IF ok><div class="ok"><TMPL_LOOP NAME=ok><li><TMPL_VAR NAME="text"></li></TMPL_LOOP></div></TMPL_IF>
<TMPL_IF error><div class="error"><TMPL_LOOP NAME=error><li><TMPL_VAR NAME="text"></li></TMPL_LOOP></div></TMPL_IF>
<div style="margin: 0 11 0 11">
<TMPL_IF content><TMPL_VAR NAME=content></TMPL_IF>
</div>
<div style="height:20px;"> </div>
</div>
<!-- /Content -->
</td>
<td width="1" nowrap bgcolor="#979797"></td>
<td width="1" nowrap></td>
</tr>
</table>
<table width="1002" cellspacing="0" cellpadding="0" border="0">
<tr height="51">
<td width="201" nowrap></td>
<td width="20" nowrap valign="top" style="background: url(images/bot_angle_left.gif) no-repeat;"></td>
<td width="100%" style="background: url(images/bot_cent.gif) repeat-x;" align="center">
<table cellspacing='0' cellpadding='0' border='0'>
<tr>
<td>Курсовая работа по программированию в сетях
<!-- <a href="" class="botmenu">Ссылка 1</a> -->
</td>
</tr>
</table>
</td>
<td width="11" nowrap valign="top" style="background: url(images/bot_angle_right.gif) no-repeat;"></td>
<td width="1" nowrap></td>
</tr>
</table>
</center>
</body>
</html>
Admin.pl
#!/usr/bin/perl
use lib '../mod';
use DBI();
use DBD::mysql;
use CGI qw/:standard/;
use CGI::Cookie;
use Time::Local;
use CGI::Carp 'fatalsToBrowser';
use HTML::Template;
require "../setup.inf"; #переменные
require "sub.pm"; #переменные
#подключеие БД
$dbh = DBI->connect("DBI:mysql:database=$db;host=$host","$user","$password");
$dbh->do("SET NAMES 'cp1251'");
$fid = param('id');
$fid2 = param('id2');
$action = param('action');
$login_in = param('login_in'); # для входа по паролю
$pass_in = param('pass_in'); #
$buffer2 = $ENV{'QUERY_STRING'};
#От SQL Иньекций
$fid =~ s/('|"|\||-|=|~|>|<|(|)|\$|#)//g;
$fid2 =~ s/('|"|\||-|=|~|>|<|(|)|\$|#)//g;
$action =~ s/('|"|\||-|=|~|>|<|(|)|\$|#)//g;
$login_in =~ s/('|"|\||-|=|~|>|<|(|)|\$|#)//g;
$pass_in =~ s/('|"|\||-|=|~|>|<|(|)|\$|#)//g;
#/От SQL Иньекций
@pairs2 = split(/&/, $buffer2);
foreach $pair2 (@pairs2) {
($name2, $value2) = split(/=/, $pair2);
$value2 =~ tr/+/ /;
$value2 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name2} = $value2;
}
$form_fid = $FORM{"id"}; $form_fid =~ s/('|"|\||-|=|~|>|<|(|)|\$|#)//g;
$viev = $FORM{"viev"};
$act = $FORM{"act"};
if ($act eq ''){ #если $act пусто. Возможно при нажатии на кнопку в форме
($xxx) = $ENV{'REQUEST_URI'} =~ m#([^\\/:]+)$#;
# ($act) = split (/\./,$xxx);
# ($act, $fid) = split (/-/,$act);
@pairs2 = split(/&/, $xxx);
foreach $pair2 (@pairs2) {
($name2, $value2) = split(/=/, $pair2);
$value2 =~ tr/+/ /;
$value2 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name2} = $value2;
}
$act = $FORM{'act'};
$fid = $FORM{'id'};
$viev = $FORM{"viev"};
}
else {$fid = $form_fid;}
#Оставляем только числа
if ($fid) {$fid =~ s/(\d+)/$1/;$fid = $1;}
if ($fid2){$fid2 =~ s/(\d+)/$1/;$fid2 = $1;}
#/Оставляем только числа
#------------------------------Время------------------------
$timeoffset = 0;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time + (3600*$timeoffset));
$mon++;
$mday = "0$mday" if ($mday < 10);
$mon = "0$mon" if ($mon < 10);
$hour = "0$hour" if ($hour < 10);
$min = "0$min" if ($min < 10);
$year = 2000 + ($year - 100);
$data_form = "$mday.$mon.$year";
$reg_date = "$year-$mon-$mday";
$time_form = "$hour:$min:$sec";
#-----------------------------------------------------------
#############################################
# Проверка паролей #
#############################################
require "modul/autentification.pl";
#############################################
####<<< SEREDINKA
if ($act eq '') {require "ind.pl";}
elsif ($act eq 'firma') {require "firma.pl";}
elsif ($act eq 'model') {require "model.pl";}
elsif ($act eq 'sale') {require "sale.pl";}
else {print "Location: http://$ENV{'SERVER_NAME'}/admin/\n\n"; exit;}
####>>>
#Информационные сообщения
if (@ok){$HTML_SITE{ok} = \@ok;}
if (@error){$HTML_SITE{error} = \@error;}
#/Информационные сообщения
print "Content-type: text/html\n\n";
my $template = HTML::Template->new(filename => 'html/admin.html');
$template->param(%HTML_SITE);
my $HTML_SITE_out = $template->output;
print <<EOF;
$HTML_SITE_out
EOF
#отключение БД
$dbh->disconnect();
Ind.pl
1;
$HTML_SITE{title} ='Главная страница';
$HTML_SITE{title2} ='Добро пожаловать в систему администрирования Интернет-магазина';
$HTML_SITE{content} ='Для работы с данной частью приложения воспользуйтесь пунктами меню в левой части экрана.';
1;
Model.pl
1;
my $sth = $dbh->prepare("SELECT id,Name_Firma FROM Firma");
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
$sel.=qq[<option value="$ref->{'id'}">$ref->{'Name_Firma'}</option>];
}
$sth->finish();
my $sth = $dbh->prepare("SELECT id,name FROM Pol");
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
$sel1.=qq[<option value="$ref->{'id'}">$ref->{'name'}</option>];
}
$sth->finish();
my $sth = $dbh->prepare("SELECT id,name FROM Kreplen");
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
$sel2.=qq[<option value="$ref->{'id'}">$ref->{'name'}</option>];
}
$sth->finish();
my $sth = $dbh->prepare("SELECT id,name FROM Mechanism");
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
$sel3.=qq[<option value="$ref->{'id'}">$ref->{'name'}</option>];
}
$sth->finish();
#act
if ($action eq 'Изменить') {&edit;}
elsif ($action eq 'Добавить'){&add;}
elsif ($action eq 'Удалить') {&del;}
#viv
if ($viev eq 'edit') {&blokedit;}
elsif ($viev eq 'add') {&blokadd;}
else {&blokviev;}
################################################################################
sub blokviev {
my $sth = $dbh->prepare("SELECT Model.*,Firma.Name_Firma as Nfirma,Pol.name as Pname,Kreplen.name as Kname,Mechanism.name as Mname
FROM Model inner join Firma on Model.id_Firma = Firma.id
inner join Pol on Model.id_Pol = Pol.id
inner join Kreplen on Model.id_Kreplen = Kreplen.id
inner join Mechanism on Model.id_Mechanism = Mechanism.id");
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
if (!($ref->{Name_Model})){$ref->{Name_Model} = "Не задано";}
my $hd; if ($ref->{ehide}){$hd="_h";}
$HTML_SITE{content}.=<<LINES;
<table border=1 cellpadding="0" cellspacing="0" align="center">
<td width=90 height=50 valign="center" align="center">
<img src="/admin/Photos/$ref->{Photo}" width="80" valign="absmiddle" align="absmiddle">
</td>
<td width=90 valign="center" align="center"><b><font color="blue">$ref->{Nfirma}</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="blue">$ref->{Name_Model}</font></b>
</td>
<td width=70 valign="center" align="center"><b><font color="red">$ref->{Price}</font> .</b>
</td>
<td><a href="?act=$act&id=$ref->{id}&viev=edit"><img src="/admin/images/editor.jpg" width="40" height="40" align="absmiddle" alt="Редактировать"></a>
</td>
<td><a href="#" onclick="del_id('$ref->{id}')"><img src="/admin/images/Urna.jpg" width="40" height="40" align="absmiddle" alt="Удалить"></a>
</td>
</table>
LINES
}
$sth->finish();
$HTML_SITE{content}.=<<LINES;
<form style="display: none" method="POST" action="" id="deletes" name="deletes"><input type="hidden" name="ids" value=""><input type="hidden" name="action" value="Удалить"></form>
LINES
$HTML_SITE{title} = "Список моделей часов [<a href=\"?act=$act&viev=add\">Добавить</a>]";
$HTML_SITE{title2} ='Просмотр';
}
################################################################################
sub blokedit {
my ($db_id,$db_Firma,$db_Name_Model,$db_Mechanism,$db_Kreplen,$db_Pol,$db_Data_post,$db_Price,$db_Photo) =
$dbh->selectrow_array("SELECT id,id_Firma,Name_Model,id_Mechanism,id_Kreplen,id_Pol,Data_post,Price,Photo FROM $act WHERE id='$fid'");
$HTML_SITE{content}=<<LINES;
<div style="clear:both"></div>
<form method="POST" enctype="multipart/form-data">
<div class="nm">Фирма</div>
<div class="nm2"><select name="Firma" size="1" style="width:30%">
$sel
</select>
<script>\$('option[\@value=$db_Firma]').get(0).selected ='selected';</script>
</div>
<divclass="nm">Название</div>
<div class="nm2"><input name="Name_Model" value="$db_Name_Model" type="text" width=200"></div>
<div class="nm">Механизм</div>
<div class="nm2"><select name="Mechanism" size="1" style="width:30%">
$sel3
</select>
<script>\$('option[\@value=$db_Mechanism]').get(1).selected ='selected';</script>
</div>
<divclass="nm">Крепление</div>
<div class="nm2"><select name="Kreplen" size="1" style="width:30%">
$sel2
</select>
<script>\$('option[\@value=$db_Kreplen]').get(2).selected ='selected';</script>
</div>
<div class="nm">Пол</div>
<div class="nm2"><select name="Pol" size="1" style="width:30%">
$sel1
</select>
<script>\$('option[\@value=$db_Pol]').get(3).selected ='selected';</script>
</div>
<divclass="nm">Дата поставки</div>
<div class="nm2"><input name="Data_post" value="$db_Data_post" type="text" width=200"></div>
<divclass="nm">Стоимость</div>
<div class="nm2"><input name="Price" value="$db_Price" type="text" width=200"></div>
<divclass="nm">Изображение</div>
<div class="nm2"><input name="Photo" value="$db_Photo" type="text" width=200"></div>
<div class="nm"><input name="action" type="submit" value="Изменить"></div>
<input name="id" value="$db_id" type="hidden">
</form>
LINES
$HTML_SITE{title} ='Список моделей часов';
$HTML_SITE{title2} ='Редактор';
}
sub blokadd {
$HTML_SITE{content}=<<LINES;
<div style="clear:both"></div>
<form method="POST" enctype="multipart/form-data">
<div class="nm">Фирма</div>
<div class="nm2"><select name="Firma" size="1" style="width:30%">
$sel
</select></div>
<div class="nm">Название</div>
<div class="nm2"><input name="Name_Model" value="$db_name" type="text" width=200"></div>
<div class="nm">Механизм</div>
<div class="nm2"><select name="Mechanism" size="1" style="width:30%">
$sel3
</select></div>
<div class="nm">Крепление</div>
<div class="nm2"><select name="Kreplen" size="1" style="width:30%">
$sel2
</select></div>
<div class="nm">Пол</div>
<div class="nm2"><select name="Pol" size="1" style="width:30%">
$sel1
</select></div>
<div class="nm">Дата поставки</div>
<div class="nm2"><input name="Data_post" value="$db_name" type="text" style="width=200"></div>
<divclass="nm">Стоимость</div>
<div class="nm2"><input name="Price" value="$db_name" type="text" style="width=200"></div>
<divclass="nm">Изображение</div>
<div class="nm2"><input name="Photo" value="$db_name" type="text" style="width=200"></div>
<div class="nm"><input name="action" type="submit" value="Добавить"></div>
<input name="firm" value="1" type="hidden">
</form>
LINES
$HTML_SITE{title} = "Список моделей часов";
$HTML_SITE{title2} ='Добавление';
}
################################################################################
sub edit {
my $Firma = param('Firma'); $Firma = $dbh->quote( $Firma );
my $Name_Model = param('Name_Model'); $Name_Model = $dbh->quote( $Name_Model );
my $Mechanism = param('Mechanism'); $Mechanism = $dbh->quote( $Mechanism );
my $Kreplen = param('Kreplen'); $Kreplen = $dbh->quote( $Kreplen );
my $Pol = param('Pol'); $Pol = $dbh->quote( $Pol );
my $Data_post = param('Data_post'); $Data_post = $dbh->quote( $Data_post );
my $Price = param('Price'); $Price = $dbh->quote( $Price );
my $Photo = param('Photo'); $Photo = $dbh->quote( $Photo );
my $sth = $dbh->prepare("UPDATE $act SET id_Firma=$Firma,Name_Model=$Name_Model,id_Mechanism=$Mechanism,id_Kreplen=$Kreplen,id_Pol=$Pol,Data_post=$Data_post,Price=$Price,Photo=$Photo WHERE (id='$fid')");
if ($sth->execute()){
push @ok, {text=>'Запись отредактирована'};
$sth->finish(); }
else {push @error, {text=>'Запись не отредактирована'}; }
}
sub add {
my $Firma = param('Firma');
my $Name_Model = param('Name_Model');
my $Mechanism = param('Mechanism');
my $Kreplen = param('Kreplen');
my $Pol = param('Pol');
my $Data_post = param('Data_post');
my $Price = param('Price');
my $Photo = param('Photo');
$Firma = $dbh->quote( $Firma );
$Name_Model = $dbh->quote( $Name_Model );
$Mechanism = $dbh->quote( $Mechanism );
$Kreplen = $dbh->quote( $Kreplen );
$Pol = $dbh->quote( $Pol );
$Data_post = $dbh->quote( $Data_post );
$Price = $dbh->quote( $Price );
$Photo = $dbh->quote( $Photo );
my $sth = $dbh->prepare("insert into $act (id_Firma,Name_Model,id_Mechanism,id_Kreplen,id_Pol,Data_post,Price,Photo) values ($Firma,$Name_Model,$Mechanism,$Kreplen,$Pol,$Data_post,$Price,$Photo)");
if ($sth->execute()){
push @ok, {text=>"Запись добавлена"};
$sth->finish(); }
else {push @error, {text=>"Запись не добавлена"}; }
}
sub del {
my $ids = param("ids"); $ids =~s/\D//g;
if ($ids) {
#Удаление из базы
$sth=$dbh->do("DELETE FROM $act WHERE (id='$ids')"); # удаляем старые
if ($sth) { push @ok, {text=>"Элемент удалён"};}
else { push @error, {text=>"Элемент удалён"};}
}
else {
push @error, {text=>"Ошибка. Возможно отключен JavaScript"};
}
}
1;
Sale.pl
1;
if ($action eq 'Удалить') {&del;}
&blokviev;
################################################################################
sub blokviev {
my $sth = $dbh->prepare("SELECT Sale.*,Model.Name_Model as Mname,Schet.fio as Sfio,
Schet.data as Sdata, Schet.nom as Snom, Firma.Name_Firma as Fname, Model.Price as Mprice
FROM Sale inner join Model on Sale.Model_id = Model.id
inner join Schet on Sale.Schet_id = Schet.id
inner join Firma on Model.id_Firma = Firma.id");
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
if (!($ref->{id})){$ref->{id} = "Не задано";}
my $hd; if ($ref->{ehide}){$hd="_h";}
$HTML_SITE{content}.=<<LINES;
<table border=1 cellpadding="0" cellspacing="0" align="center">
<td width=30 valign="center" align="center"><b><font color="blue">$ref->{Snom}</font></b>
</td>
<td width=200 valign="center" align="center"><b><font color="blue">$ref->{Sfio}</font></b>
</td>
<td width=80 valign="center" align="center"><b><font color="blue">$ref->{Fname}</font></b>
</td>
<td width=100 valign="center" align="center"><b><font color="blue">$ref->{Mname}</font></b>
</td>
<td width=170 valign="center" align="center"><b><font color="blue">$ref->{Sdata}</font></b>
</td>
<td width=50 valign="center" align="center"><b><font color="blue">$ref->{Mprice}</font> р.</b>
</td>
<td><a href="#" onclick="del_id('$ref->{id}')"><img src="/admin/images/Urna.jpg" width="40" height="40" align="absmiddle" alt="Удалить"></a>
</td>
</table>
LINES
}
$sth->finish();
$HTML_SITE{content}.=<<LINES;
<form style="display: none" method="POST" action="" id="deletes" name="deletes"><input type="hidden" name="ids" value=""><input type="hidden" name="action" value="Удалить"></form>
LINES
$HTML_SITE{title} = "Просмотр сведений о покупках";
}
################################################################################
sub del {
my $ids = param("ids"); $ids =~s/\D//g;
if ($ids) {
#Удаление из базы
$sth=$dbh->do("DELETE FROM $act WHERE (id='$ids')"); # удаляем старые
if ($sth) { push @ok, {text=>"Элемент удалён"};}
else { push @error, {text=>"Элемент не удалён"};}
}
else {
push @error, {text=>"Ошибка. Возможно отключен JavaScript"};
}
}
1;
Пользовательская часть
Index
.
pl
#!/usr/bin/perl
use lib 'mod';
use DBI();
use DBD::mysql;
use CGI qw/:standard/;
use CGI::Cookie;
use Time::Local;
use CGI::Carp 'fatalsToBrowser';
use HTML::Template;
require "setup.inf"; #переменные
#require "sub.pm"; #переменные
#подключеие БД
$dbh = DBI->connect("DBI:mysql:database=$db;host=$host","$user","$password");
$dbh->do("SET NAMES 'cp1251'");
$fid = param('id1');
$fid2 = param('id2');
$action = param('action');
$buffer2 = $ENV{'QUERY_STRING'};
#От SQL Иньекций
$fid =~ s/('|"|\||-|=|~|>|<|(|)|\$|#)//g;
$fid2 =~ s/('|"|\||-|=|~|>|<|(|)|\$|#)//g;
$action =~ s/('|"|\||-|=|~|>|<|(|)|\$|#)//g;
#/От SQL Иньекций
@pairs2 = split(/&/, $buffer2);
foreach $pair2 (@pairs2) {
($name2, $value2) = split(/=/, $pair2);
$value2 =~ tr/+/ /;
$value2 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name2} = $value2;
}
$form_fid = $FORM{"id1"}; $form_fid =~ s/('|"|\||-|=|~|>|<|(|)|\$|#)//g;
$viev = $FORM{"viev"};
$act = $FORM{"act"};
if ($act eq ''){ #если $act пусто. Возможно при нажатии на кнопку в форме
($xxx) = $ENV{'REQUEST_URI'} =~ m#([^\\/:]+)$#;
($act) = split (/\./,$xxx);
($act, $fid) = split (/-/,$act);
my $tmp = substr("$act", 0,1);
if ($tmp eq '?'){$act = '';}
#@pairs2 = split(/&/, $xxx);
#foreach $pair2 (@pairs2) {
# ($name2, $value2) = split(/=/, $pair2);
# $value2 =~ tr/+/ /;
# $value2 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# $FORM{$name2} = $value2;
#}
$act = $FORM{'act'};
$fid = $FORM{'id1'};
$viev = $FORM{"viev"};
}
else {$fid = $form_fid;}
#Оставляем только числа
if ($fid) {$fid =~ s/(\d+)/$1/;$fid = $1;}
if ($fid2){$fid2 =~ s/(\d+)/$1/;$fid2 = $1;}
#/Оставляем только числа
#------------------------------Время------------------------
$timeoffset = 0;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time + (3600*$timeoffset));
$mon++;
$mday = "0$mday" if ($mday < 10);
$mon = "0$mon" if ($mon < 10);
$hour = "0$hour" if ($hour < 10);
$min = "0$min" if ($min < 10);
$year = 2000 + ($year - 100);
$data_form = "$mday.$mon.$year";
$reg_date = "$year-$mon-$mday";
$time_form = "$hour:$min:$sec";
#-----------------------------------------------------------
#############################################
####<<< SEREDINKA
if ($act eq '') {require "ind.pl";}
elsif ($act eq 'basket') {require "basket.pl";}
elsif ($act eq 'all_model') {require "all_model.pl";}
elsif ($act eq 'model_find') {require "model_find.pl";}
elsif ($act eq 'firms') {require "firms.pl";}
else {print "Location: http://$ENV{'SERVER_NAME'}/\n\n"; exit;}
####>>>
#Информационные сообщения
if (@ok){$HTML_SITE{ok} = \@ok;}
if (@error){$HTML_SITE{error} = \@error;}
#/Информационные сообщения
print "Content-type: text/html\n\n";
my $template = HTML::Template->new(filename => 'html/index.html');
$template->param(%HTML_SITE);
my $HTML_SITE_out = $template->output;
print <<EOF;
$HTML_SITE_out
EOF
#отключение БД
$dbh->disconnect();
All_model.pl
1;
&blokviev;
################################################################################
sub blokviev {
my $sth = $dbh->prepare("SELECT Model.*,Firma.Name_Firma as Nfirma,Pol.name as Pname,Kreplen.name as Kname,Mechanism.name as Mname
FROM Model inner join Firma on Model.id_Firma = Firma.id
inner join Pol on Model.id_Pol = Pol.id
inner join Kreplen on Model.id_Kreplen = Kreplen.id
inner join Mechanism on Model.id_Mechanism = Mechanism.id");
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
if (!($ref->{Name_Model})){$ref->{Name_Model} = "Не задано";}
my $hd; if ($ref->{ehide}){$hd="_h";}
$HTML_SITE{content}.=<<LINES;
<table border=1 cellpadding="3" cellspacing="3" align="center">
<td rowspan=8 align="center">
<img src="/admin/Photos/$ref->{Photo}" width="80" valign="absmiddle" align="absmiddle">
</td>
<td width=100 valign="center" align="center"><b><font color="#666666">Фирма</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="blue">$ref->{Nfirma}</font></b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Модель</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="blue">$ref->{Name_Model}</font></b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Пол</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="blue">$ref->{Pname}</font></b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Ремешок</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="blue">$ref->{Kname}</font></b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Механизм</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="blue">$ref->{Mname}</font></b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Дата поставки</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="blue">$ref->{Data_post}</font></b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Стоимость</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="red">$ref->{Price}</font> р.</b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Добавить в корзину</font></b>
</td>
<td width=150 valign="center" align="center"><a href="javascript:addbasket($ref->{id});"><img src="/admin/images/basket.jpg" width="40" height="40" align="absmiddle" alt="Добавить в корзину"></a>
</td>
</table>
<table align="center">
<td height="10">
</td>
</table>
LINES
}
$sth->finish();
$HTML_SITE{title} = "Просмотр всех моделей часов";
}
################################################################################
1;
Model_find.pl
1;
my $sth = $dbh->prepare("SELECT id,Name_Firma FROM Firma");
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
$sel.=qq[<option value="$ref->{'id'}">$ref->{'Name_Firma'}</option>];
}
$sth->finish();
if ($action eq 'Подобрать'){&clocksfind;}
else{&viev;}
sub viev {
$HTML_SITE{title} = "Выбор часов по параметрам";
$HTML_SITE{content}.=<<LINES;
<form style="display: none" method="POST" action="" id="deletes" name="deletes"><input type="hidden" name="ids" value=""><input type="hidden" name="action" value="Удалить"></form>
<br>
<h2>Заполните поля для поиска</h2>
<form method="POST" action="">
<br>
<div align="center"><b>Фирма</b></div>
<br>
<div align="center"><select name="firm" size="1" style="width:30%">
$sel
<option value="0" selected></option>
</select></div>
<br>
<div align="center"><b>Цена</b></div>
<br>
<div align="center"> от <input name="otcen" value="" type="text" style="width:25%"> ---- до <input name="docen" value="" type="text" style="width:25%"></div>
<br>
<divalign="center"><b>Дата поступления</b>(Вводить в формате гггг-мм-дд)</div>
<br>
<div align="center"> от <input name="otdata" value="" type="text" style="width:25%"> ---- до <input name="dodata" value="" type="text" style="width:25%"></div>
<br>
<div align="center"><input name="action" type="submit" value="Подобрать"></div>
</form>
LINES
}
#######################################
sub clocksfind {
my $firm = param('firm');
my $otcen = param('otcen');
my $docen = param('docen');
my $otdata = param('otdata');
my $dodata = param('dodata');
$firm = $dbh->quote( $firm );
$otcen = $dbh->quote( $otcen );
$docen = $dbh->quote( $docen );
$otdata = $dbh->quote( $otdata );
$dodata = $dbh->quote( $dodata );
my $sth = $dbh->prepare("SELECT Model.*,Firma.Name_Firma as Nfirma,Pol.name as Pname,Kreplen.name as Kname,Mechanism.name as Mname
FROM Model inner join Firma on Model.id_Firma = Firma.id
inner join Pol on Model.id_Pol = Pol.id
inner join Kreplen on Model.id_Kreplen = Kreplen.id
inner join Mechanism on Model.id_Mechanism = Mechanism.id where ((Model.id_Firma=$firm)or($firm=0))
and ((Model.Price between $otcen and $docen) or ($otcen=0 and $docen=0))
and ((Model.Data_post between $otdata and $dodata) or ($otdata=0 and $dodata=0))");
$HTML_SITE{title} = "Выбор часов по параметрам";
$sth->execute();
$sumstr=0;
while (my $ref = $sth->fetchrow_hashref()) {
if (!($ref->{Name_Model})){$ref->{Name_Model} = "Не найдено!";}
my $hd; if ($ref->{ehide}){$hd="_h";}
$HTML_SITE{content}.=<<LINES;
<table border=1 cellpadding="3" cellspacing="3" align="center">
<td rowspan=8 align="center">
<img src="/admin/Photos/$ref->{Photo}" width="80" valign="absmiddle" align="absmiddle">
</td>
<td width=100 valign="center" align="center"><b><font color="#666666">Фирма</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="blue">$ref->{Nfirma}</font></b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Модель</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="blue">$ref->{Name_Model}</font></b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Пол</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="blue">$ref->{Pname}</font></b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Ремешок</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="blue">$ref->{Kname}</font></b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Механизм</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="blue">$ref->{Mname}</font></b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Дата поставки</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="blue">$ref->{Data_post}</font></b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Стоимость</font></b>
</td>
<td width=150 valign="center" align="center"><b><font color="red">$ref->{Price}</font> р.</b>
</td>
<tr>
<td width=100 valign="center" align="center"><b><font color="#666666">Добавить в корзину</font></b>
</td>
<td width=150 valign="center" align="center"><a href="javascript:addbasket($ref->{id});"><img src="/admin/images/basket.jpg" width="40" height="40" align="absmiddle" alt="Добавить в корзину"></a>
</td>
</table>
<table align="center">
<td height="10">
</td>
</table>
LINES
$sumstr=$sumstr+1;
}
if ($sumstr==0){$HTML_SITE{title2} = "Извините, но по данным параметрам ничего подобрать не получилось";}
$sth->finish();
}
1;
Basket.pl
1;
if ($action eq 'Оформить_заказ') {&zakaz;}
elsif ($action eq 'Удалить') {&del;}
#viv
if (($action eq 'Оформить_заказ') and ($kvit)){&kvitanc;}
else{&viev;}
sub viev {
$q = CGI->new();
my $cookies = $q->cookie('basket');
@ms = split(/:/,$cookies);
$sum=0;
foreach $ls (@ms){
my ($ss1,$ss2) = split(/-/,$ls);
if (($idd1 eq $ss1) and ($idd2 eq $ss2)){ #условие чтобы не выводить уже удалённую модель. Нужно, т.к. куки не успевают записаться
}else{
my (@db) = $dbh->selectrow_array("
SELECT Firma.Name_Firma as Nfirma,Model.Name_Model,Model.Price
FROM Model inner join Firma on Model.id_Firma = Firma.id WHERE Model.id='$ss1'
");
$text.=<<LINES;
<tr><td align="center"><p>$db[0]</p></td><td align="center">$db[1]</td><td align="center">$db[2]</td><td><a href="#" onclick="delbasket('$ss1-$ss2')"><img src="/admin/images/Urna.jpg" width="30" height="30" align="absmiddle" alt="title" alt="Удалить"></a></td></tr>
LINES
$sum=$sum+$db[2];
}
}
$HTML_SITE{title} = "Корзина";
$HTML_SITE{content}.=<<LINES;
<table cellpadding=5 cellspacing=5 width=50% align="center">
<tr>
<td align="center"><p><b>Фирма</b></p></td>
<td align="center"><b>Модель</b></td>
<td align="center"><b>Стоимость</b></td>
<td></td>
</tr>
$text
</table>
<HR WIDTH="50%" SIZE="3" color="red">
<table cellpadding=5 cellspacing=5 width=50% align="center">
<tdalign="center">
Общая сумма заказа равна $sum рублей
</td>
</table>
<form style="display: none" method="POST" action="" id="deletes" name="deletes"><input type="hidden" name="ids" value=""><input type="hidden" name="action" value="Удалить"></form>
<br>
<h2>Пожалуйста заполните форму</h2>
<fontcolor="red">*</font><small>Поля обязательные для заполнения</small>
<form method="POST" action="">
<br>
<div align="center"><font color="red">*</font>ФИО</div>
<div align="center"><input name="fio" value="" type="text" style="width:50%"></div>
<br>
<div align="center"><font color="red">*</font>Телефон</div>
<div align="center"><input name="tel" value="" type="text" style="width:50%"></div>
<br>
<div align="center"><font color="red">*</font>Email</div>
<div align="center"><input name="email" value="" type="text" style="width:50%"></div>
<br>
<div align="center"><input name="action" type="submit" value="Оформить_заказ"></div>
</form>
LINES
}
#######################################
sub kvitanc {
require "kvit.pm";
my $kvit = &kvit($idins);
$HTML_SITE{content}="$kvit";
}
#######################################
sub del {
my $ids = param("ids");
$q = CGI->new();
my $cookies = $q->cookie('basket');
@ms = split(/:/,$cookies);
($idd1, $idd2) = split(/-/,$ids);
foreach $ls (@ms){
my ($ss1,$ss2) = split(/-/,$ls);
if (($ss1 eq $idd1) and ($ss2 eq $idd2)){
}else{
if ($newcook){
$newcook = "$newcook:$ss1-$ss2";
}else{
$newcook = "$ss1-$ss2";
}
}
}
#Устанавливаем новые куки средствам Perl
$c = new CGI::Cookie(-name=>'basket',
-value=>"$newcook",
);
$c =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$c =~ s/<!--(.|\n)*-->//g;
print "Set-Cookie: $c\n";
}
######################################
sub zakaz {
my $fio = param('fio');
my $tel = param('tel');
my $email = param('email');
if ($fio and $tel and $email){
#Создаём номер квитанции
my $noschet = $dbh->selectrow_array("SELECT max( nom ) FROM schet");
$noschet++;
$fio = $dbh->quote( $fio );
$tel = $dbh->quote( $tel );
$email = $dbh->quote( $email );
#Записываем квитанцию в базу
my $sth = $dbh->prepare("insert into schet (nom,fio,tel,email,data) values ('$noschet',$fio,$tel,$email,'$reg_date $time_form')");
if ($sth->execute()){
$idins = $sth->{'mysql_insertid'};
$sth->finish();
#Заносим купленные билеты. т.е. отмечаем их, что они купленные
$q = CGI->new();
my $cookies = $q->cookie('basket');
@ms = split(/:/,$cookies);
foreach $ls (@ms){
my ($ss1,$ss2) = split(/-/,$ls);
$sth=$dbh->do("INSERT INTO sale (Model_id, schet_id) VALUES ('$ss1', '$idins')"); # добавляем новый
#Удаляем куки
my $c = new CGI::Cookie(-name=>'basket',
-expires => '-1y',
);
$c =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$c =~ s/<!--(.|\n)*-->//g;
print "Set-Cookie: $c\n";
$kvit=1;
}
}
}else{
$HTML_SITE{title2} = "<p style=\"color:red;\">Не заполнены обязательные поля</p>";
}
}
1;
Приложение Б
Результаты тестирования
Рисунок Б-1 — Введены неверные логин и пароль.
Рисунок Б-2 — Успешная авторизация.
Рисунок Б-3 — Добавляем новые часы.
Рисунок Б-4 — Данные добавились.
Рисунок Б-5 — Хотим редактировать верхнюю запись.
Рисунок Б-6 — Изменяем стоимость.
Рисунок Б-7 — Данные изменены.
Рисунок Б-8 — Удаляем ранее добавленный товар.
Рисунок Б-9 — Данные корректно удалены.
Рисунок Б-10 — Заполняем поля для запроса.
Рисунок Б-11 — По нашему запросу вывелись 2 модели.
Рисунок Б-12 — Добавляем товар в корзину.
Рисунок Б-13 — Проверяем корзину, товар в ней присутствует.
|