Академический Документы
Профессиональный Документы
Культура Документы
Дагестанский филиал
ДОПУЩЕН К ЗАЩИТЕ
ДИПЛОМНАЯ РАБОТА
ТЕМА: Интернет-приложение на основе технологии Ajax с
использованием концепции MVC (администраторская часть)
Руководитель работы: ст. преподаватель Латифов М.С.
Консультант по спецчасти: ___________________________________________
Консультант по ____________________________________________________
Консультант по ____________________________________________________
Рецензент: _________________________________________________________
Исполнитель: Магомедрасулова Х. С
Группа: ВО-08, Шифр: ДГС 081009
Махачкала – 2013 г.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
Кафедра ИиВТ
УТВЕРЖДАЮ
Заведующий кафедрой
Гусейнов Р.В.
“____” ____________________ 2013 г.
ЗАДАНИЕ
на дипломное проектирование
2
5. Задание по разделу «Экологичность и безопасность проекта»:
Характеристика условий труда программиста
Анализ опасных и вредных факторов, воздействующих на программиста
Всего: 7 листов.
3
АННОТАЦИЯ
4
СОДЕРЖАНИЕ
ВВЕДЕНИЕ...................................................................................................................................7
5
3.2 Проектирование базы данных интернет-приложения.........................................44
ЗАКЛЮЧЕНИЕ.........................................................................................................................71
ПРИЛОЖЕНИЯ........................................................................................................................74
7
требовательны к ресурсам и не предъявляют строгих требований к
аппаратной части.
Сегодня существует множество технологий, позволяющих создавать
надёжные и эффективные интернет-приложения, отвечающие самым
современным требованиям и удобные в использовании. Огромную
популярность, на сегодняшний день, набирает новый подход к разработке
веб-приложений, называемый AJAX, при использовании которой,
приложения не перезагружаются целиком, а за счет асинхронного обращения
к веб-серверу догружают необходимые данные с сервера.
Интернет-приложения, как правило, состоят и клиентской и
администраторской части. Клиентская часть отвечает за пользовательский
интерфейс, взаимодействие с пользователями, в то время как
администраторская часть позволяет работать с содержимым базы данных
приложения и управлять самим приложением.
Цель дипломной работы – изучение современных технологий
разработки интернет-приложений и применение их на практике.
В работе требуется реализовать администраторскую часть интернет-
приложения, в качестве которого будет выступать панель
администрирования интернет-магазина компьютерной техники.
8
ГЛАВА 1. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ
9
Последние версии HTTP (версия 1.0 появилась в 1996 г., а версия 1.1 в 1999)
стали тем протоколом, который сегодня применяется в Интернете.
В 1994 году был создан консорциум W3C (World Wide Web Consor-
tium), в чьи задачи входило разрабатывать и внедрять технологические
стандарты для Всемирной паутины.
В 1995 году появилась первая официальная спецификация HTML 2.0. В
ней появилась возможность вставлять рисунки, гиперссылки и формы
отправки информации на сервер. В марте 1995 года была предложена версия
HTML 3.0, но из-за сложной реализации в браузерах того времени, она так и
не стала стандартом. Самым важным обновлением в данной версии HTML
была поддержка Каскадных таблиц стилей CSS (Cascading Style Sheets),
позволяющих производить графическое описание документа:
задания цветов, шрифтов, расположения отдельных блоков и других аспектов
представления внешнего вида веб-страниц.
С появлением спецификации HTML 3.2 в январе 1997 года начался
подъем в веб-дизайне.
Текущая версия HTML 4.01 была стандартизирована 24 декабря 1999
года. В настоящее время разрабатывается стандарт HTML 5, находящийся в
стадии разработки по состоянию на февраль 2013 года.
Простота HTML, заключающаяся в ограниченности количества тегов и
полного безразличия к структуре документа, превратилась в его главный
недостаток и побудила разработчиков W3C к созданию нового языка
разметки. В результате появился расширяемый язык разметки XML (Xtensi-
ble Markup Language), сочетающий в себе простоту HTML, логику разметки
SGML и удовлетворяющий требованиям Интернета. Он используется для
создания многих веб-приложений, в том числе и для мобильных устройств.
HTTP и HTML, на сегодняшний день, продолжают оставаться удачной
парой, понятной как веб-серверам, так и веб-клиентам, и составляют
фундамент современного Интернета.
10
1.1.2 Современные веб-сервера
13
основе построены такие популярные проекты как Twitter, Diaspora, Look At
Me, Basecamp, GitHub и другие.
Не менее популярен язык Python и Django - свободный фреймворк
для веб-приложений, использующий шаблон проектирования MVC,
применяемый в крупных и известных сайтов, таких как Instagram, Disqus,
Mozilla и др. Одним из существенных архитектурных отличий фреймворка от
остальных – структура сайта на Django представляет собой один или
несколько приложений в виде подключаемых модулей. Еще одно
существенное отличие – обработчики URL в Django конфигурируются при
помощи регулярных выражений и не выводятся автоматически из структуры
моделей контроллеров. Основной принцип работы фреймворка - DRY -
принципа разработки программного обеспечения, цель которого состоит в
снижении повторения различного рода информации.
В операционной системе Windows используется технология ASP.NET.
ASP.NET. Главной особенностью разработки Web-приложений при помощи
ASP.NET является возможность использовать любой язык программирования
среды исполнения .NET.
Технология привлекательна тем, что можно от самых простых сайтов,
состоящих их нескольких страниц, до очень сложных, обрабатывающих
миллионы запросов в день. Основной недостаток – достаточно дорогие
хостинги и необходимость покупки серверной лицензии, в случае с
выделенным хостингом. В 2007 году в ASP.NET был добавлен фреймворк
ASP.NET MVC Framework для создания веб-приложений, который
реализует шаблон Model-View-Controller.
14
1.2 Технология AJAX
16
Рисунок 1. Схема работы классического веб-приложения
Сервер обрабатывает запрос, генерирует полностью новую веб-
страницу и отправляет ее браузеру. Само веб-приложение может выступать в
качестве клиента других служб, например, базы данных или другого веб-
приложения, расположенного на другом сервере. Такая модель работы
приложения называется синхронной.
В синхронной модели все процессы выполняются последовательно,
один за другим (рис. 2). Минусом такой модели является тот факт, что
пользователю не доступны другие операции, пока происходит обмен
данными, к тому же если потребуется обновить лишь небольшую часть веб-
страницы, то приходится обновлять всю старицу целиком.
17
Рисунок 2. Диаграмма синхронной модели работы веб-приложения
18
При получении запроса приложение загружает написанный на
JavaScript специальный движок AJAX.
19
1. Клиентская. Исполняется на стороне клиента и написана на языке
JavaScript. Здесь происходит сбор и подготовка информации для
отправки запроса на сервер, открывается соединения с указанием типа
запроса (GET или POST), URL серверной части, флага асинхронного
режима. Затем происходит непосредственная отправка запроса и
обработка ответа серверной части.
2. Серверная, которая исполняется на сервере и написана на любом языке
программирования. Здесь происходит обработка полученных данных и их
отправка к клиенту.
Наиболее важным аспектом AJAX является та часть процесса, которая
относится к HTTP-запросу. Асинхронная отправка данных на сервер и
получение в ответ дополнительных данных является основным назначением
AJAX.
Первоначальным аспектом Ajax-процесса является открытие
соединения с сервером. Особенность всей методологии Ajax заключается в
передаче данных от клиента (например, веб-браузера) к серверу. Первой
стадией отправки данных на сервер является приведение их к такому
формату, который мог бы легко прочитан сервером.
Объект XMLHTTPRequest (XHR) – низкоуровневая основа
большинства AJAX-приложений, использующая запросы HTTP (HTTPS)
напрямую к веб-серверу и загружая полученные данные прямо в
вызывающий скрипт. Аспектом создания и использования XMLHttpRequest,
который ставит его выше всех остальных упрощенных форм односторонней
связи, является возможность чтения различных текстовых форматов данных,
посылаемых сервером. В некоторых AJAX-фреймворках вместо
XMLHttpRequest могут использоваться IFrame или SCRIPT-тег.
Сценарий на стороне сервера отправляет свой ответ по протоколу
HTTP, при этом ответ должен иметь такой формат, который легко может
быть разобран JavaScript-кодом на стороне клиента. Можно выбрать любой
20
формат передачи данных: HTML, простой текст, XML. Один из известных
форматов передачи – JSON (JavaScript Object Notation).
AJAX, в первую очередь, используют для небольших элементов
управления. Эта технология является прекрасным решением в таких случаях,
как:
быстрая отправка сообщения без перезагрузки страницы,
проверка правильности введенных данных,
редактирование заполненных полей в формах,
реализация опросов на сайте,
разработка простых чатов,
подгрузка данных с сервера и др.
21
• Ускорение реакции интерфейса. Пользователю виден результат действий
быстрее, поскольку загружается только изменившаяся часть веб-
страницы.
С AJAX также связаны и потенциальные трудности:
• Динамически подгружаемое содержимое не индексируется,
вследствие чего оно не доступно поисковым машинам.
• Отсутствие интеграции со стандартными инструментами браузера,
т. к. динамически создаваемые страницы не регистрируются
браузером в истории посещения страниц, поэтому не работает
кнопка «Назад».
• Отсутствие возможности сохранения страницы в закладки
браузера.
• Нефункциональность AJAX в случае отключения в браузере
JavaScript.
22
1.3.1 Классическая реализация MVC
23
Классическую реализацию паттерна MVC принято ассоциировать
именно с активной моделью.
Представление (View) отвечает за отображение данных средствами
графического интерфейса и реагирует на изменения модели.
Представление имеет свободный доступ к данным модели, однако не может
ничего в ней менять. Для взаимодействия с контроллером представление
реализует некий интерфейс, известный контроллеру, что позволяет менять
представления независимо и иметь несколько представлений на один
контроллер.
Контроллер (Controller) управляет действиями пользователя, оповещая
модель о необходимости изменений. Контроллер может работать с
несколькими представлениями. В классической версии MVC контроллер не
передает данные из модели в представление.
Схема взаимодействия компонентов MVC (рис. 5):
Контроллер реагирует на действия пользователя и вызывает
соответствующие изменения данных модели. После, модель сообщает
представление о том, что она изменилась. Представление обращается
к модели за обновленными данными, после чего их и отображает.
24
Существуют два принципиальных типа разделения компонентов
концепции MVC: отделение представления от модели и отделение
контроллера от представления.
Отделение Представления от Модели — один из методов
проектирования программного обеспечения, наличие которого производят по
ряду причин.
Реализация Представления и Модели относятся к совершенно разным
сферам веб-программирования. Представление отвечает на вопросы
разработки механизмов пользовательского интерфейса и
эргономичности интерфейса приложения для пользователя. В то время
как работа с Моделью предполагает упор на бизнес-логику и на
взаимодействии с базой данных.
В зависимости от ситуации, одна и та же информация может быть
отображена разными способами в приложении. Отделение
Представления от Модели позволяет разработать, в таком случае, один
и тот же код Модели для нескольких Представлений.
Главное преимущество в отделении Представления от Модели -
программисты, занимающиеся разработкой модели, не будут осведомлены о
работе над интерфейсом Представления, что существенно облегчит
разработку Модели и позволит с легкостью расширить количество
Представлений для одной и той же Модели. Кроме того, изменение
интерфейса Представления не потребует изменения Модели.
Отделение Контроллера от Представления не так эффективен, в
отличие от предыдущего тип разделения. Практически во всех версиях
Smalltalk разделение на Контроллер и Представление не проводилось. На
практике каждому Представлению соответствует один соответствующий
Контроллер.
Полезность применения данной концепции заключатся в том, что:
1. К одной и той же Модели можно сопоставить
несколько Представлений, не затрагивая при этом реализации Модели.
25
2. Не затрагивая реализацию Представлений, имеется возможность
изменить реакции на действия пользователей, для этого достаточно
использовать другой Контроллер.
3. Имеется возможность разделения полномочий разработчиков.
Развитие объектно-ориентированной парадигмы программирования и
введение понятия шаблонов проектирования привели к созданию ряда
модификаций концепции MVC. В период широкой популярности веб-
приложений, шаблон MVC был адаптирован и к веб-разработке.
26
обращаться к базе данных, не должен работать с данными, полученными из
запроса пользователя. В качестве отображения может быть применен
шаблон. Виды обычно разделяют на общий шаблон, содержащий разметку,
общую для всех страниц и части шаблона, которые используют для
отображения данных выводимых из модели. Допускается наличие
нескольких различных видов, наилучшим образом подходящих для текущей
ситуации.
Контроллер управляет запросами пользователя, получаемыми в виде
запросов HTTP GET или POST. Его основная функция — вызывать и
координировать действие необходимых ресурсов и объектов, нужных для
выполнения действий, задаваемых пользователем. Обычно контроллер
вызывает соответствующую модель для задачи и выбирает подходящий для
него вид.
27
Рисунок 7. Диаграмма последовательностей MVC
28
4. После получения запроса от пользователя, создается экземпляр
запрошенного Контроллера и вызывается указанное действие.
5. Далее вызываются методы Модели, изменяющие ее.
6. Генерируется представление.
7. Представление запрашивает данные для отображения.
8. Модель возвращает запрошенные данные.
9. Представление отображает результаты пользователю.
В зависимости от внутренней логики приложения возможны случаи,
когда после получения запроса от пользователя, контроллер либо формирует
представление страницы, либо вызывает методы модели, модель уведомляет
представление об изменения и обновленное представление отображается
пользователю. При использовании, например, технологии AJAX (рис. 8)
возможны случаи, когда приложение получает запрос, вызывает указанное
действие контроллера, в представлении генерируется отображение для ввода
данных, после того, как данные введены, вызывается тот же контроллер,
который проверяет и обрабатывает полученные данные и формирует
другое представление или же обновляет текущее.
29
Шаблон MVC примечателен в веб-разработке тем, что при создании
сложных проектов позволяет отделить работу веб-программиста или группы
программистов, дизайнера, верстальщика и т. д.
30
заменены результатами выборки данных из базы данных. Подобная схема
позволяет создавать статическую часть страницы с помощью обычных
средств, а для получения динамической информации маркеры обращаются к
отдельным частям программы.
32
1.4 Постановка задач и требований к проектируемому
интернет-приложению
33
Разрабатываемая панель администрирования интернет-магазина
должна содержать следующий необходимый минимум функций:
управление товарами:
o добавление новых товаров;
o удаление товаров;
o редактирование товаров;
управление категориями товаров:
o добавление категорий;
o удаление категорий;
o редактирование категорий;
управление заказами:
o просмотр заказов;
o редактирование заказов;
o отмена заказов;
o оплата заказов;
управление пользователями:
o просмотр пользователей;
o просмотр заказов пользователей.
переписка с пользователями:
o модерация комментариев;
o добавление ответа на комментарий.
34
ГЛАВА 2. ВЫБОР ИНСТРУМЕНТОВ И СРЕДСТВ ДЛЯ
РАЗРАБОТКИ
35
PHP - это скриптовый язык, который легко может быть встроен в
HTML и широко применяемый для разработки web-приложений. PHP
доступен для большинства операционных систем, включена также поддержка
большинства современных веб-серверов. Преимуществом PHP является
поддержка многих баз данных.
Начиная с версии PHP 5, включена полная поддержка ООП, которая до
этой версии обеспечивалась лишь частично.
В настоящее время поддерживается подавляющим большинством
хостинг-провайдеров и является одним из лидеров среди языков веб-
программирования, позволяющих разработчикам легко создавать
интерактивные страницы.
В интернет-приложении язык программирования PHP используется с
целью:
программирования логии интернет-приложения;
взаимодействия с базой данных;
обработки данных на сервере, полученной от Ajax.
Язык предоставляет полный доступ к исходному коду, его
можно свободно использовать, изменять и распространять.
Для программирования клиентской части приложения используется
язык JavaScript – кроссплатформенный скриптовый язык.
В проектируемом интернет-приложении Javascript используется в
следующих целях:
проверка данных формы перед передачей их на сервер;
объединение компонентов Ajax;
моделирования связи с базой данных;
обработка ответов полученных от сервера и вывод их
пользователю.
При проектировании данного интернет-приложения была использована
библиотека Javascript – jQuery. Эта библиотека помогает легко получать
36
доступ к любому элементу DOM, обращаться к атрибутам и содержимому
элементов DOM и манипулировать ими. Также библиотека jQuery
предоставляет удобный интерфейс прикладного программирования по работе
с Ajax.
Преимущества jQuery перед JavaScript :
- существенное уменьшение объема программного кода, по сравнению
с JavaScript, и, как следствие, читабельность кода,
- обширная и удобная документация,
- использование Ajax намного проще,
- наличие огромного количества плагинов.
37
MySQL представляет собой программное обеспечение с открытым
кодом. Пакет MySQL доступен по схеме двойного лицензирования. Его
можно свободно использовать до тех пор, пока соблюдаются требования
лицензии GNU (GPL). При распространении приложений, не попадающих
под действие этой лицензии, требует приобретения коммерческой лицензии.
Связка MySQL с языком PHP, на сегодняшний день, является самой
популярной.
39
Главная страница
Категории
Товары
Изменение
статуса заказа
Просмотр Изменение
отдельного данных о
заказа покупателе
Заказы (главная
страница) Просмотр
Изменение
содержимого
содержимого
отдельного
заказа
заказа
40
Работа с категориями включает в себя добавление новой категории и
просмотр информации о категории, в которой имеется возможность
редактировать саму категорию либо удалить ее.
Редактирован
Просмотр ие категории
информации
Категории о категории Удаление
(главная
Добавление категории
страница)
новой
категории
Добавление
изображения
товара
Редактирован
Просмотр
ие
информации
Товары информации
о товаре
(главная о товаре
страница) Добавление Удаление
нового товара товара
Просмотр Добавиление
информации о ответа к
Обратная связь комментарии комментарию
(главная
страница)
Модерация
сообщения
43
index.php Router->start()
Браузер Подключение ядра Анализирует URL.
Запрашивает Выявление текущего
приложения.
страницу Контроллера, действия и
Запуск
интернет- параметров.
приложения.
приложения. Перенаправление
запроса.
Диспетчеризация
Controller
Проверка полученных
данных View Браузер
Получение данных из Представление вида Отображение
модели. страницы. полученной
Генерирование Подстановка страницы
Представления. переменных.
Передача переменных
Представлению.
Model
Работа с базой
данных
47
3 name varchar(150) название товара
4 price int(11) цена товара
5 quantity int(11) количество товара на складе
6 image varchar(250) изображение товара
7 description text описание товара
48
4 date date дата заказа
5 text text текст комментария
наличие ответа:
6 answer tinyint(1) 0 – отсутствие ответа;
1 – наличие ответа.
статус комментария:
7 0 – ожидает одобрения;
mod int(1)
1 – одобрен;
2 – запрещен.
49
Рисунок 16. Схема базы данных
Router – Класс-маршрутизатор.
Отвечает за анализ запросов, выделяя запрашиваемый контроллер и
действие и перенаправляя данный запрос. Блок схема алгоритма работы
анализа запросов представлена на рисунке 17.
51
Рисунок 17. Блок схема процесса анализа запросов
52
start() – выделяет из текущего запроса контроллер и его метод, а
также передаваемые параметры, затем создает объект контроллера и
вызывает его метод.
53
get_view() – устанавливает общий для всего интернет-приложения
шаблон представления.
AJAX-файл.
Принимает запрос от приложения, перенаправляет их
соответствующему методу контроллера и выводит результат прямо на
страницу приложения.
showBox(id) – выводит список купленных товаров в виде
всплывающего окошка. Принимает на вход ID заказа.
hideBox() – закрывает окошко со списком купленных товаров.
boxAddEditShow() – выводит на экран окно добавления
(редактирования).
deleteItemOrder(idProduct, idOrder) – удаляет товар из текущего
заказа и обновляет сумму заказа. Принимает на вход ID товара и
текущего заказа.
boxListShow() – выводит список статусов заказа.
changeStatus(id) – изменяет статус заказа. Принимает на вход ID
заказа.
editClient(id) – редактирует информацию о клиенте. Принимает на
вход ID заказа.
addItemOrder(idOrder) – добавляет товар в текущий заказ и
обновляет сумму заказа. Принимает на вход ID заказа.
getChildCategory(id) – подгружает на страницу дочерние категории.
Принимает на вход ID родительской категории.
addProduct() – добавляет новый товар в базу данных.
editProduct(id) – редактирует информацию о товаре в базе данных.
Принимает на вход ID товара.
deleteProduct(id) – удаляет товар из базы данных. Принимает на вход
ID товара.
54
addCat() – добавление новой категории.
editCat(id) – редактирование информации о категории. Принимает
на вход ID категории.
yesComment(id) – одобрение комментария посетителя. Принимает на
вход ID сообщения.
noComment(id) – запрещение комментария посетителя. Принимает
на вход ID сообщения.
addAnswer(id) – добавление ответа администратора. Принимает на
вход ID сообщения.
Модуль “Заказы”.
Данный модуль отвечает за работу с заказами интернет-магазина.
Контроллер Controller_Order содержит следующие методы:
55
index- генерирует шаблон главной страницы заказов и вызывает
модель, выводящий все заказы, сортированные в обратном порядке.
about – формирует страницу, отображающую полную информацию
об отдельном заказе, идентификационный номер которого
передается через метод GET.
delete – удаляет товар из заказа и обновляет общую сумму заказа.
Принимает на вход идентификаторы товара и заказа. Вызывается с
помощью AJAX-запроса.
newstatus – действие, изменяющий статус текущего заказа и
вызываемое AJAX-запросом. Принимает на вход идентификатор
заказа и новый статус заказа.
additem – добавление товара в текущий заказ через AJAX, принимая
идентификатор заказа, идентификатор товара и его количество и
передавая их в базу данных.
Класс модели Model_Order содержит следующие методы:
get_num_order() – определяет количество заказов в базе данных.
get_list_order($start, $per) – формирует список заказов.
get_order_info_client($id_order) – формирует список заказов
отдельного пользователя.
get_about_order($id_order) – возвращает полную информацию о
заказе, включая список товаров в заказе и информацию о
покупателе.
get_list_order_item($id_order) – возвращает детальную информацию
о пунктах, входящих в состав отдельного заказа.
update_order($id_product, $id_order) – обновляет общую стоимость
заказа.
delete_product_order($id_product, $id_order) – удаляет товар из
заказа.
get_amount_order($id_order) – возвращает общую стоимость заказа.
56
update_status_order($id_order, $new_status) – изменяет статус заказа.
add_item_order($id_order, $id_product, $name, $count) – добавление
товара в заказ.
Модуль “Категории”.
Модуль отвечает за работу с категориями товаров. Контроллер модуля
Controller_Category содержит следующие действия:
index – вызывает представление главной страницы для работы с
категориями в виде раскрывающегося дерева. По умолчанию
выводятся главные категории. При нажатии на кнопку раскрытия
узла дерева, вызывается метод parent, в который передается
идентификатор родительской категории.
about – формирует страницу, выводящую информацию о категории.
Принимает в качестве параметра идентификатор этой категории.
parent – выводит дерево дочерних категорий. Вызывается AJAX
методом и принимает на вход идентификатор родительской
категории.
add – добавление новой категории. Вызывается AJAX методом и
принимает на вход идентификатор родительской категории и
название новой категории.
edit – редактирование информации о категории, принимает
идентификатор, новое название категории и вызывается
посредством AJAX.
Класс модели Model_Category содержит следующие методы:
get_main_category() – возвращает список главных категорий.
get_about_category($id_category) – получение информации о
категории.
get_child_category($id_parent) – формирование списка дочерних
категорий.
57
get_list_category() – возвращает список категорий.
tree_category($list, $id_parent, $select, $t='') – рекурсивная функция
для составления дерева категорий, по отношению к родительской
категории.
add_new_category($title, $id_parent) – добавление новой категории.
edit_category($id_category, $title, $id_parent, $old_parent) -
редактирвание информации о категории.
Модуль “Товары”.
Данный модуль служит для работы со списком товаров.
В класс модуля Controller_Product входят следующие методы:
index – формирует главную страницу и выводит список всех товаров
из базы данных.
about – генерирует информационную страницу об отдельном
товаре, принимает на вход идентификатор товара.
add – добавляет в базу данных новый товар посредством AJAX
запроса. Принимает на вход название нового товара, категории, к
которой он относится, количество и стоимость.
edit – редактирование информации о товаре, вызываемый AJAX
методом и принимающим на вход новое название товара, его
количество и стоимость.
delete – удаление товара из базы данных. Принимает идентификатор
удаляемого товара. Вызывается средствами AJAX.
upload – добавление изображения товара.
Класс модели Model_Product содержит следующие методы:
get_num_product() – определение количества товаров в базе данных.
get_list_product($start, $per) – формирует список товаров.
get_about_product($id) – возвращает информацию о товаре.
58
get_product_image($id) – выводит строку, состоящую из названий
изображений товаров через символ “|”.
add_new_product($new_product) – добавляет в базу данных нового
товара.
edit_product($id, $product) – редактирование информации о товаре.
delete_product($id) – удаление товара.
add_images($id, $img) – добавление изображения товара.
Модуль “Покупатели”.
Предназначен для работы с пользователями.
Контроллер модуля Controller_Client содержит следующие действия:
index – формирует главную страницу, выводящий список всех
покупателей интернет-магазина.
about – генерирует страницу, выводящую информацию о покупателе
и всех его заказов. Принимает на вход идентификатор покупателя.
order – формирование страницы, выводящую информацию о
содержимом отдельного заказа покупателя. Вызывается AJAX
методом. Принимает идентификатор пользователя и заказа.
edit – редактирование информации о покупателе. Принимает на вход
идентификатор пользователя, и новые данные о покупателе.
Вызывается AJAX методом.
Класс модели содержит следующие методы:
get_num_client() – возвращает количество покупателей.
get_list_client($start, $per) – формирует список покупателей.
get_info_client($id_client) – получение информации о покупателе.
get_list_order_client($id_client) – формирование списка заказов
покупателя.
edit_data_client($id_client, $new_data) – редактирование информации
о покупателе.
59
Модуль “Обратная связь”.
Данный модуль отвечает за переписку с пользователями интернет-
магазина.
Контроллер Controller_Comment содержит следующие методы:
index- генерирует шаблон главной страницы переписки и вызывает
модель, выводящий все комментарии, сортированные в обратном
порядке.
about – формирует страницу, отображающую информацию о
сообщении пользователя, идентификационный номер которого
передается через метод GET.
yes_comment – одобряет комментарий. Принимает на вход
идентификаторы сообщения. Вызывается с помощью AJAX-запроса.
no_comment – запрещает комментарий. Принимает на вход
идентификаторы сообщения. Вызывается с помощью AJAX-запроса.
add_answer – добавление ответ на комментарий через AJAX-запрос,
принимая идентификатор комментария и текст сообщения ответа.
Класс модели Model_Order содержит следующие методы:
get_num_comment()– определяет количество сообщений
пользователей в базе данных.
get_list_comment($start, $per)– формирует список комментариев.
get_about_comment($id) – возвращает информацию о комментарии
пользователя.
change_status_comment ($id_comment, $status) – изменение статуса
модерации комментария.
add_answer_comment($id_comment, $text) – добавление ответа на
комментарий пользователя.
60
ГЛАВА 4. ЭКОНОМИКО-ОРГАНИЗАЦИОННЫЙ
РАЗДЕЛ
61
Общая трудоемкость разработки программного средства (ПС)
рассчитывается по формуле
T 0 =K сл⋅Т р (4.1)
где Тр – значение трудоемкости, определенной
по объему разрабатываемого ПС для соответствующей группы
сложности, Ксл – дополнительный коэффициент сложности.
На основании общего объема ПС и группы сложности определим, что
такому объему условных машинных команд будут соответствовать затраты
труда Тр = 445 чел.-дн.
Коэффициент сложности рассчитывается по следующей формуле:
n
К сл =1+ ∑ К i (4.2)
i =1
где Кi – коэффициент, учитывающий уровень
повышения сложности по дополнительным характеристикам ПП, n –
количество дополнительно учитываемых характеристик.
Ксл =1 + 0.08 = 1,08 (4.3)
Таким образом, общая трудоемкость равна
T 0 =445⋅1 , 08=356 чел.-дн. (4.4)
Трудоемкость каждой стадии разработки, учитывающего уровень
повышения сложности ПС:
внедрение (ВН):
Т ВН =Lвн⋅K H⋅T 0 ,
(4.9)
62
где Li – удельный вес трудоемкости i-ой стадии разработки, Кн –
поправочный коэффициент, учитывающий степень новизны ПП, Кт –
поправочный коэффициент, учитывающий степень использования в
разработке типовых стандартных программ.
Разрабатываемое приложение можно отнести к группе «В» с
коэффициентом новизны Кн = 0,7 и коэффициентами удельных весов
трудоемкости: Lэп = 0,09, Lтз = 0,07, Lтп = 0,07, Lрп = 0,61, Lвн = 0,16.
Кроме того, степень охвата реализуемых функций разрабатываемого сайта
типовыми ПС выше 60%, следовательно, поправочный коэффициент Кт =
0,6. Отсюда найдем значения трудоемкостей каждой стадии разработки:
T ЭП =0 , 09⋅0 ,7⋅356≈22 , 4 чел-дн,
63
где Ni – количество разработчиков, принимающих участие в разработке ПС
на i-й стадии; Ф – фонд времени одного разработчика в течение года, Тi -
трудоемкость разработки i-й стадии.
Таким образом необходимый срок реализации ПС составляет:
188 , 6
t= ≈0 , 3
3⋅230 года приблизительно 98 дней
К разр =
З ⋅W ⋅t
мес н
раз + Ц ⋅Т ⋅К
мч раз мульт
Д , (4.13)
где Змес – среднемесячная заработная плата одного разработчика, руб.;
WH – коэффициент отчислений на социальные нужды (1,26);
Д – среднее число рабочих дней в месяц;
Цмч – цена одного часа машинного времени, руб.;
Траз – трудоёмкость работ, чел.-дн.(принимается равной 20% от Ту);
Кмульт – коэффициент мультипрограммности, характеризующий способ
организации работы, обеспечивающий одновременное выполнение
нескольких программ.
13000⋅1 , 26
К разр = ⋅98+ 75⋅38⋅1=75815,5
22 руб.
Стоимость освоения ПС:
К осв =
З ⋅W ⋅t
мес н
осв + Ц ⋅Т ⋅К
мч осв мульт
Д , (4.14)
64
Тосв – затраты машинного времени на основание ПС пользователем (3 дня по 8
часов • 0,75 = 18 часов).
13000⋅1 , 26
К разр = ⋅18,86+75⋅18⋅1=15392,13
22 руб.
t −t
Э мв = Ц ⋅К
мч мульт⋅100
1 2
V ⋅N
⋅ 0 обр
, (4.15)
где Nобр – число обращений к ПС за последний год,
t1 и t2 - средний расход машинного времени на единицу работ,
выполняемых с помощью базового и нового программного средства, час на
100 условных единиц.
0 ,66−0 , 25
Э мв=75⋅1⋅ ⋅10000⋅252=774900
100 руб.
Экономия затрат на заработную плату в организации пользователя:
Э зрп= З ⋅W ⋅( Ш − Ш )⋅Ч
мес н 1 2 мес , (4.16)
где Ш 1 , Ш2 – количество сотрудников в организации пользователя при
базовом и новом варианте ПС, чел.,
Чмес - количество месяцев в году.
Э зрп=13000⋅1 ,26⋅( 4−1)⋅12=589680 руб.
Амортизация вычислительной техники:
А г= В ⋅0 , 5⋅N
т а , (4.17)
где Вт - первоначальные затраты на приобретение техники, руб.;
0,5 - коэффициент, отражающий использование техники,
приходящихся на данное ПС в год;
65
Na - коэффициент амортизационных отчислений (в год).
А г=100000⋅0 ,5⋅0 , 15=7500 руб
Общая экономия текущих затрат за год составит:
Э г= Э мв + Э мз + Э зрп− А г . (4.18)
Э г=774900+504 +589680−7500=1357584 руб.
Годовой экономический эффект:
Э ф= Э +Е г норм⋅ К пс . (4.19)
Э ф=1357584+0 ,3⋅91207,6=1384946,3 руб.
Ожидаемый срок окупаемости всех инвестиций:
Т инв =
( К +В пс т)
Э г . (4.20)
(91207 , 6+100000 )
Т инв = =0,14
1384946 , 3 года.
Ожидаемый срок окупаемости инвестиций в ПС:
Т пс =
К пс
Э г . (4.21)
91207 , 6
Т пс= =0,07
1384946 , 3 года.
Коэффициент сравнительной экономической эффективности:
1 1
Еинв = Еинв =
Т инв , Т пс (4.22)
1 1
Еинв = =0 ,7 Еинв = =14 ,3
0 , 14 , 0 , 07
Таким образом, экономическое обоснование разработки ПС показывает
целесообразность его применения, т.к. годовая экономия составит 1357584
руб., а годовой экономический эффект - 135946,3 руб. Ожидаемый срок
окупаемости инвестиций в ПС – в течение двух месяцев.
66
ГЛАВА 5. ЭКОЛОГИЧНОСТЬ И БЕЗОПАСНОСТЬ
ПРОЕКТА
68
мышцах шеи и плечевого пояса, болях в позвоночнике, болезненности и
одеревенелости в мышцах рук и ног.
Причиной болезней пальцев и кистей рук является специфика работы
на клавиатуре: программисты с высокой скоростью повторяют одни и те же
движения.
69
5.2 Разработка оптимальных условий труда
72
Монитор компьютера следует располагаться на расстоянии не ближе
50 см от глаз пользователя.
При длительной работе за компьютером, необходимы перерыв каждые
полчаса. В перерывах нужно постараться выполнять упражнения для глаз,
подходящим решением является трехминутные перерывы каждый час. Также
следует индивидуально настроить монитор так, чтобы его яркость и
контрастность были комфортными для зрения.
ЗАКЛЮЧЕНИЕ
74
7. Зандстра М. PHP: объекты, шаблоны и методики программирования,
3-е изд.: Пер. с анг. – М.: ООО “И. Д. Вильямс”, 2012. – 560 с.
8. Крейн Д., Паскарелло Э., Даррен Д. AJAX в действии. – М.: ООО “И.
Д. Вильямс”, 2006. – 640 с.
9. Маклафлин Б. Изучаем Ajax – СПб.: “Питер”, 2007. – 443c.
10. Маринченко А.В. Безопасность жизнедеятельности (учебное
пособие) – М.: ИТК “ Дашков и Ко”, 2007. – 360с.
11.Фаулер М. Архитектура корпоративных программных приложений.:
Пер. с анг. – М.: ООО “И. Д. Вильямс”, 2006. – 544 с.
12.Фримен Э., Фримен Э., Сьерра К., Бейтс Б. Паттерны проектирования.
– СПб.: “Питер”, 2011. – 656 с.
13.Хольцнер C. Ajax. Библия программиста. — М.: “Диалектика”, 2009. –
553 с.
14.Шлосснейгл Дж. Профессиональное программирование на
PHP.: Пер. с англ. – М.: ООО “И. Д. Вильямс”, 2006. – 624 с.
15. Sweat, J. PHP | Architect's Guide to PHP Design Patterns / J. Sweat
– Marco Tabini & Associates, Inc., 2005. – 340 c.
16. Гарретт Д. Д. «Ajax: A New Approach to Web Applications» [В
Интернете]. – 2005г. – http://www.adaptivepath.com/publications/essays/
archives/000385.php
17. Шалаев Ю. Снижение шума системного блока компьютера [В
Интернете]. – 2008 г. – http://oldoctober.com/ru/snizhenie-shuma-
sistemnogo-
bloka/
18. http://www.w3.org/ - Официальный сайт Консорциума Всемирной
паутины.
19. http://php.net – Официальная документация языка PHP.
20. http://jquery.com/ - Официальный сайт проекта jQuery.
75
ПРИЛОЖЕНИЯ
Главная страница
76
Рисунок 1. Главная страница интернет-приложения
Страница «Заказы»
77
Рисунок 3. Страница просмотра полной информации о заказе
79
Рисунок 7. Страница просмотра информации о товаре
80
Рисунок 8. AJAX-страница редактирования информации о товаре
Приложение 2. Диаграмма классов
81
Приложение 3. Программные листинги
-- --------------------------------------------------------
--
-- Структура таблицы `answer_comment`
--
-- --------------------------------------------------------
--
-- Структура таблицы `category`
--
-- --------------------------------------------------------
82
--
-- Структура таблицы `client`
--
-- --------------------------------------------------------
--
-- Структура таблицы `comment`
--
-- --------------------------------------------------------
--
-- Структура таблицы `item_order`
83
--
-- --------------------------------------------------------
--
-- Структура таблицы `order`
--
-- --------------------------------------------------------
--
-- Структура таблицы `product`
--
84
`price` int(11) NOT NULL,
`quantity` int(11) NOT NULL,
`image` varchar(250) NOT NULL,
`description` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=18 ;
static $_instance;
/**
* Паттерн "одиночка"
*
* @return object
*/
static function getInstance() {
if(!(self::$_instance instanceof self))
self::$_instance = new self();
return self::$_instance;
}
/**
*
*/
function start() {
$request = $_SERVER['REQUEST_URI'];
$splits = explode ('/', trim($request,'/'));
if ($i%2 == 0)
$keys[] = $splits[$i];
else
$value[] = $splits[$i];
}
if (count($keys) == count($value)) {
$params = array_combine ($keys, $value);
}else {
echo 'ERROR';
}
if (isset ($params))
$_GET = $params;
}
if(class_exists($controller)) {
// создаем объект контроллера
$controller_name = new $controller;
if (method_exists($controller_name, $action)) {
// вызываем действие контроллера
$controller_name->$action();
}else{
header("HTTP/1.0 404 Not Found");
echo 'К сожалению такой страницы не существует';
}
}else{
header("HTTP/1.0 404 Not Found");
echo 'К сожалению такой страницы не существует';
}
}
/www/core/database.php
<?php
/**
* Database
*
* Класс соединения с базой данных
*
*/
class Database{
86
public $connect;
public $database;
/**
* Соединение с базой данных
*
*/
function connect() {
$host = 'localhost';
$user = 'root';
$password = '';
$db = 'eshop';
/**
* Закрытие соединения с базой данных
*/
function close() {
mysql_close($this->conn);
}
}
/www/core/model.php
<?php
/**
* Model
*
* Класс главной модели
87
*/
class Model extends Database {
function __construct() {
parent::connect();
}
}
/www/core/controller.php
<?php
/**
* Controller
* Класс главного контроллера
*/
class Controller {
/**
* Модель
*
* @var object
*
*/
public $model;
/**
*Представление
*
* @var object
*
*/
public $view;
/**
*Заголовок страницы
*
* @var string
*
88
*/
protected $title;
/**
*Содержание страницы
*
* @var string
*
*/
protected $content;
/**
* Конструктор класса
*
*/
function __construct() {
$this->view = new View();
$this->title = 'Панель управления: ';
}
/**
* Установка общего вида шаблона
*/
function get_view() {
$vars = array ('title' => $this->title,
'content' => $this->content);
echo $this->view->render('layout.php', $vars);
}
}
/www/core/view.php
<?php
/**
* View
*
* Класс генерации представления
89
*
*/
class View {
/**
* Подключение шаблона страницы
*
* @param string $template Подключаемый шаблон
* @param array $params Передаваемые переменные
* @return Подключаемый шаблон с установлеными переменными
*/
function fetch_part($template, $params = array ()) {
// Установка переменных для шаблона.
foreach ($params as $k => $v) {
$$k = $v;
}
ob_start();
include '/application/view/'.$template;
return ob_get_clean();
}
/**
* Генерация шаблона
*
* @param string $template Подключаемый шаблон
* @param array $params Передаваемые переменные
* @return Полностью сгенерированный шаблон
*/
function render($template, $params = array ()) {
return $this->fetch_part($template, $params);
}
}
/www/core/bootstrap.php
90
<?php
/**
* Файл загрузки ядра приложения
*
*/
include_once ("router.php");
include_once ("database.php");
include_once ("view.php");
include_once ("controller.php");
include_once ("model.php");
AuthType Basic
AuthName 'Authorization please'
AuthUserFile /home/admin/www/.htpasswd
Require valid-user
/www/index.php
<?php
include_once ("/core/bootstrap.php");
include ("/lib/pagination.php");
function __autoload($class){
$fname = str_replace('_', '/', strtolower($class));
91
require_once ('application/'.$fname.'.php');
}
$router = Router::getInstance();
$router->start(); // запускаем маршрутизатор
/**
* Определение колличества заказов
*
* @return integer колличество заказов
*/
function get_num_order() {
return $num_rows;
}
/**
* Составление списка заказов
*
* @param integer $start начало выборки
* @param integer $per колличество отбираемых записей
* @return array список заказов
*/
92
function get_list_order($start, $per) {
$list = array();
while ($row = mysql_fetch_assoc($result)){
$list[] = $row;
}
return $list;
}
/**
* Получение информации о заказе одного клиента
*
* @param integer $id_order ID заказа
* @return array
*/
function get_order_info_client($id_order) {
$list = array();
93
while ($row = mysql_fetch_assoc($result)){
$list[] = $row;
}
return $list;
}
/**
* Получение даных об отдельном заказе
*
* @param integer $id_order ID заказа
* @return array
*/
function get_about_order($id_order) {
$list = array();
while ($row = mysql_fetch_assoc($result)){
$list[] = $row;
}
return $list;
}
94
/**
* Получение списка товаров в корзине
*
* @param integer $id_order ID заказа
* @return array
*/
function get_list_order_item($id_order) {
$list = array();
while ($row = mysql_fetch_assoc($result)){
$list[] = $row;
}
return $list;
}
/**
* Обновление заказа
*
* @param integer $id_product ID товара
* @param integer $id_order ID заказа
*/
function update_order($id_product, $id_order) {
95
$sql = "SELECT `cost`
FROM `item_order`
WHERE `id_order` = '$id_order' AND
`id_product` = '$id_product'";
$result = mysql_query($sql) or die (mysql_error());
$row = mysql_fetch_array ($result);
/**
* Удаление товара из корзины
*
* @param integer $id_product ID товара
* @param integer $id_order ID заказа
*/
function delete_product_order($id_product, $id_order) {
/**
* Получение общей суммы заказа
*
* @param integer $id_order ID заказа
* @return iteger сумма заказа
*/
96
function get_amount_order($id_order) {
return $amount;
}
/**
* Обновление статуса заказа
*
* @param integer $id_order ID заказа
* @param string $new_status новый статус заказа
*/
function update_status_order($id_order, $new_status) {
/**
* Получение цены товара
*
* @param integer $id_product ID товара
* @return integer цена товара
*/
function get_item_price($id_product){
return $price;
/**
* Доваление товара в корзину
*
* @param integer $id_order ID заказа
* @param integer $id_product ID товара
* @param string $name наименование товара
* @param integer $count колличество товара
* @return array
*/
function add_item_order($id_order, $id_product, $name,
$count) {
$price = $this->get_item_price($id_product);
$cost = $price * $count;
//обновить общую стоимость заказа
$sql = "UPDATE `order`
SET `amount` = `amount` + $cost
WHERE `id` = '$id_order'";
mysql_query($sql) or die (mysql_error());
Контроллер
/www/application/controller/order.php
<?php
/**
* Controller_Order
*
* Контроллер страницы заказов
*
*/
class Controller_Order extends Controller{
/**
* Формирование главной странцы заказов
*
*/
function action_index() {
$this->model = new Model_Order();
$list_order = array ();
//колличество заказов
$num_order = $this->model->get_num_order();
99
$per_page = (isset ($_GET['pagesize']))
? (int) ($_GET['pagesize'])
: 10;
/**
* Формирование страницы информации о заказе
*
*/
function action_about() {
$this->model = new Model_Order();
$about_order = array ();
100
$this->title = $this->title .'Заказы';
$this->content = $this->view->render('order_about.php',
array ('order' => $about_order,
'item_order' => $item_order));
$this->get_view();
}
/**
* AJAX удаление товара из заказа
*
* @return integer обновленная сумма заказа
*
*/
function action_delete() {
$this->model = new Model_Order();
$id_product = isset($_GET['product'])
? intval($_GET['product'])
: null;
$id_order = isset($_GET['order'])
? intval($_GET['order'])
: null;
$this->model->update_order($id_product, $id_order);
$this->model->delete_product_order($id_product,
$id_order);
$amount_order = $this->model->
get_amount_order($id_order);
echo json_encode($amount_order);
}
/**
* AJAX смена статуса заказа
*
* @return string новый статус заказа
101
*
*/
function action_newstatus() {
$this->model = new Model_Order();
$id_order = isset($_GET['id'])
? intval($_GET['id']) : null;
$status = (isset ($_POST['select']))
? ($_POST['select']) : "ERROR";
$this->model->update_status_order($id_order, $status);
echo $status;
}
/**
* AJAX добавление товара в заказ
*
* @return integer обновленная сумма заказа
*
*/
function action_additem() {
$this->model = new Model_Order();
$id_order = isset($_GET['id'])
? intval($_GET['id']) : null;
$id_product = (isset ($_POST['id_product']))
? ($_POST['id_product']) : "ERROR";
$name = (isset ($_POST['name']))
? ($_POST['name']) : "ERROR";
$count = (isset ($_POST['count']))
? ($_POST['count']) : "ERROR";
$new_item_order = $this->model->
add_item_order($id_order, $id_product, $name, $count);
$amount_order = $this->model->
get_amount_order($id_order);
102
$new_item_order['amount'] = $amount_order;
echo json_encode($new_item_order);
}
}
Представление
/www/application/view/layot.php
<!DOCTYPE HTML>
<html>
<head>
<title><?php echo $title?></title>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8">
<link rel="stylesheet" type="text/css" href="/css/
style.css">
<script type="text/javascript" src="/script/
jquery.js"></script>
<script type="text/javascript" src="/script/
admin.js"></script>
</head>
<body>
<div id="wrapper">
<div id="header">
<p>Панель администратора</p>
</div>
<div id="navigator">
<ul class="menu">
<li><a href="/">Главная</a></li>
<li><a href="/order">Заказы</a></li>
<li><a href="/category">Каталог товаров</a>
<ul>
<li><a href="/
category">Категории</a></li>
103
<li><a href="/product">Товар</a></
li>
</ul>
</li>
<li><a href="/client">Покупатели</a></li>
<li><a href="/comment">Обратная связь</a></
li>
</ul>
</div>
<div id="content">
<?php echo $content ?>
</div>
</div>
<div id="footer">
<p>© 2013 Магомедрасулова Хадижат,
по всем вопросам обращайтесь по e-mail:
<a
href="mailto:khadizham@yandex.ru">khadizham@yandex.ru</a>
</p>
</div>
</body>
</html>
/www/application/view/order_index.php
<div class="content_caption">
<p>Список заказов<?php echo ' ('.$num_order.')' ?></p>
</div>
<div class="content_sheet">
<div class="per_page">
<?php echo $page_size ?>
</div>
<table>
<tr>
104
<th>ID</th>
<th>Статус</th>
<th>Дата</th>
<th>Покупатель</th>
<th>Сумма</th>
<th>Товары</th>
</tr>
<?php foreach ($list_order as $order): ?>
<tr>
<td><a href="/order/about/id/<?php echo $order['id'] ?
>"><?php echo $order['id'] ?></a></td>
<td><?php echo $order['status'] ?> </td>
<td><?php echo $order['date'] ?> </td>
<td><?php echo $order['lastname'].' '.$order['first-
name'] ?> </td>
<td><?php echo $order['amount']. ' RUR' ?> </td>
<td><a id="<?php echo $order['id'] ?>" href="#"
onmouseover="showBox(this.id)"
onmouseout="hideBox()"><img src="/
image/info.png" alt="info"></a></td>
</tr>
<?php endforeach ?>
</table>
<div class="pages">
<?php echo $links ?>
</div>
</div>
<div id="box">
<div>Содержимое заказа</div>
</div>
/www/application/view/order_about.php
<div class="content_caption">
<p>Заказ №<?php echo $_GET['id']?></p>
105
</div>
<div class="content_sheet">
<div id="return">
<a href="/order">← Вернуться</a>
</div>
<div class="table">
<p>Информация о заказе</p>
<?php foreach ($order as $v): ?>
<dl class="content_data">
<dt>ID:</dt>
<dd><?php echo $v['id'] ?></dd>
<dt>Дата заказа:</dt>
<dd><?php echo $v['date'] ?></dd>
<dt>Сумма заказа:</dt>
<dd id="amount"><?php echo $v['amount'] ?> RUR</dd>
<dt>Статус:</dt>
<dd id="status"><?php echo $v['status'] ?>
<button id="change" onclick="boxList-
Show()">Изменить</button>
</dd>
</dl>
</div>
<div class="table">
<p>Информация о покупателе </p>
<table id="form_list">
<tr>
<th>Покупатель:</th>
<td class="fio"><?php echo $v['lastname'].'
'.$v['firstname'] ?></td>
</tr>
<tr>
<th>e-mail:</th>
<td class="email"><?php echo $v['email'] ?></td>
</tr>
<tr>
106
<th>Адрес:</th>
<td class="address"><?php echo $v['address'] ?></td>
</tr>
<tr>
<th>Телефон:</th>
<td class="phone"><?php echo $v['phone'] ?></td>
</tr>
</table>
<div class="button">
<button onclick="editClient(<?php echo
$v['id_user'] ?>)">Редактировать</button>
</div>
</div>
<table id="table_item_order">
<tr>
<th>Товары в корзине</th>
<th>Цена</th>
<th>Количество</th>
<th>Сумма</th>
<th>Удалить</th>
</tr>
<?php foreach ($item_order as $vs): ?>
<tr id="<?php echo $vs['id_product']?>">
<td><?php echo
htmlspecialchars($vs['name']) ?></td>
<td><?php echo $vs['price'] ?> RUR</td>
<td><?php echo $vs['count'] ?> шт.</td>
<td><?php echo $vs['cost']?> RUR</td>
<td><a href="javascript:void(0)"
onclick="deleteItemOrder(<?php
echo $vs['id_product']?>, <?php echo $vs['id_order']?>)">
<img src="/image/del.png" alt="delete"></a>
</td>
</tr>
107
<?php endforeach ?>
</table>
<div id="foot">
<button onclick="addItemOrder(<?php echo
$vs['id_order']?>)">Добавить в корзину</button>
<p class="td_p"><span>ИТОГ: </span><?php echo
$v['amount'] ?> RUR</p>
</div>
<?php endforeach ?>
</div>
<div id="box_add_edit">
<?php foreach ($order as $v): ?>
<a class="box_close"></a>
<p>Редактировать покупателя</p>
<table>
<tr>
<th>Фамилия:</th>
<td><input class="lastname" type="text" value="<?
php echo $v['lastname']?>"></td>
</tr>
<tr>
<th>Имя:</th>
<td><input class="firstname" type="text" value="<?
php echo $v['firstname'] ?>"></td>
</tr>
<tr>
<th>e-mail:</th>
<td><input class="email" type="text" value="<?php
echo $v['email'] ?>"></td>
</tr>
<tr>
<th>Адрес:</th>
<td><input class="address" type="text" value="<?
php echo $v['address'] ?>"></td>
108
</tr>
<tr>
<th>Телефон:</th>
<td><input class="phone" type="text" value="<?php
echo $v['phone'] ?>"></td>
</tr>
</table>
<div>
<button id="save_edit_client">Сохранить</button>
<button id="cancel_edit_client">Отмена</button>
</div>
<?php endforeach ?>
</div>
<div id="box_list">
<?php foreach ($order as $v): ?>
<select>
<option value="Новый">Новый</option>
<option value="Ожидает проверки">Ожидает
проверки</option>
<option value="Подтвержден">Подтвержден</option>
<option value="Оплачен">Отменен</option>
<option value="Отправлен">Отправлен</option>
<option value="Доставлен">Доставлен</option>
<option value="Оплачен">Оплачен</option>
</select>
<button onclick="changeStatus(<?php echo $v['id'] ?
>)">Сохранить</button>
<?php endforeach ?>
</div>
<div id="box_add_item">
<a class="box_item_close"></a>
<p>Добавление товара</p>
<table>
109
<tr>
<th>ID:</th>
<td><input id="id_product" type="text"
value=""></td>
</tr>
<tr>
<th>Название товара:</th>
<td><input id="name" type="text" value=""></td>
</tr>
<tr>
<th>Колличество:</th>
<td><input id="sum" type="text" value=""></td>
</tr>
</table>
<div>
<button id="add_item">Добавить</button>
<button id="cancel_add_item">Отмена</button>
</div>
</div>
/**
* Функция удаления товара из текущего заказа
*
* @param {integer} idProduct ID удаляемого продукта
* @param {integer} idOrder ID заказа
*/
function deleteItemOrder(idProduct, idOrder) {
$.ajax({
type: 'GET',
async: false,
url: "/order/delete/order/" + idOrder + "/product/" +
idProduct,
dataType: 'json',
success: function(data) {
$(idTag).remove();
/**
111
* Функция вывода списка статусов заказа
*
* @returns возвращает текущий статус
*/
function boxListShow(){
$("#box_list").show();
obj_left = $("#change").offset().left;
obj_top = $("#change").offset().top;
$("#box_list").css({"left": obj_left, "top": obj_top});
return slct;
}
/**
* Функция изменения статуса заказа
*
* @param {integer} id ID заказа
* @return {string} новый статус заказа
*/
function changeStatus(id){
$.ajax({
type: "POST",
async: false,
url: "/order/newstatus/id/" + id,
data: { select: newStatus },
success: function (data) {
var txt = data+ '<button id="change" onclick="boxList-
Show(' + id + ')">Изменить</button>';
112
$("#status").html(txt);
$("#box_list").hide();
}
});
/**
* Функция редактирования информации о клиенте
*
* @param integer id ID клиента
* @return {array} новые данные о клиенте
*/
function editClient(id) {
boxAddEditShow();
lastname = $('input.lastname').val();
firstname = $('input.firstname').val();
email = $('input.email').val();
address = $('input.address').val();
phone = $('input.phone').val();
if (lastname =='') {
$('tr input.lastname').after("Введите фамилию");
} else if (firstname =='') {
$('tr input.firstname').after("Введите имя");
} else if (email =='') {
$('tr input.email').after("Введите e-mail");
} else if (address =='') {
$('tr input.address').after("Введите адрес");
} else if (phone =='') {
$('tr input.phone').after("Введите телефон");
} else {
$.ajax({
type: "POST",
async: false,
url: "/client/edit/id/" + id,
data: { lastname: lastname,
firstname: firstname,
114
email: email,
address: address,
phone: phone },
success: function (data) {
//обновить данные о клиенте на странице
$("#form_list td.fio")
.text(lastname + ' ' +firstname);
$("#form_list td.email")
.text(email);
$("#form_list td.address")
.text(address);
$("#form_list td.phone")
.text(phone);
$("#box_add_edit").fadeOut();
}
});
}
});
/**
* Функция добаления товара в текущий заказ
*
* @param {integer} idOrder ID заказа
* @return {array} новый товар
*/
function addItemOrder(idOrder){
$("#box_add_item").show();
var idProduct;
var nameProduct;
var countProduct;
115
window_width = $(window).width();
window_height = $(window).height();
obj_width = $("#box_add_item").width();
obj_height = $("#box_add_item").height();
$("#box_add_item").css('top', (window_height/2)-
(obj_height/2)+5).css('left', (window_width/2)-(obj_width/2));
if (idProduct =='') {
$('tr input#sum').after("Введите код товара")
} else if (nameProduct =='') {
$('tr input#id_product')
.after("Введите наименование товара");
} else if (countProduct =='') {
$('tr input#id_product')
116
.after("Введите колличество");
} else {
$.ajax({
type: "POST",
async: false,
url: "/order/additem/order/" + idOrder,
dataType: "json",
data: { id_product: idProduct,
name: nameProduct,
count: countProduct
},
success: function (data) {
$('#id_product').val("");
$('#name').val("");
$('#sum').val("");
$("#box_add_item").hide();
}
});
}
117
});
}
118