Разработка ПО для поиска человека в городе и деревне - Курсовая работа

бесплатно 0
4.5 96
Разработка программных средств для информационной системы поиска человека в городе и в деревне с помощью шаблона "цепочка обязанностей". Модель предметной области. Начальная диаграмма вариантов использования. Название и классификация данного паттерна.

Скачать работу Скачать уникальную работу

Чтобы скачать работу, Вы должны пройти проверку:


Аннотация к работе
Авторизованный пользователь Пользователь, который имеет доступ ко всей информации других пользователей, может добавлять свой профиль в систему Неавторизованный пользователь Найти пользователей по определенному критерию Пользователь должен иметь возможность получить данные о людях, но контактную информацию неавторизованный пользователь не видит Авторизованный пользователь Найти пользователей по определенному критерию Пользователь должен иметь возможность получить данные о людях и о любых данных, указанных в анкете Администратор Найти пользователей по определенному критерию Пользователь должен иметь возможность получить данные о людях и о любых данных, указанных в анкете Действующие лица: неавторизованный пользователь, авторизованный пользователь, администратор. пользователь запускает приложение на персональном компьютере.Классы фреймворка предназначены для работы с адресной строкой, системой, базой данных, пользователем. Служит для инициализации переменных класса LOADCSS - служит для загрузки файлов css LOADJS - служит для загрузки файлов js render - служит для загрузки необходимого файла (-ов) block - служит для загрузки блока данных, т.е. для повторяющегося элемента кода SHOWSYSTEMMESSAGE - служит для показа системных сообщений при успешном действии или при ошибке. Исходя из проведенного анализа функциональных и нефункциональных требований, было решено, что приложение будет состоять из нескольких тематических разделов: страница настройки фильтров поиска и вывода результатов, страница авторизации, главная страница, страница «О системе», а также страницы редактирования и добавления профиля человека. User - класс необходим для работы с пользователем, а именно для определения статуса пользователя: авторизованный, неавторизованный или администратор, для авторизации пользователя. Тип данных - smallint. nick - ник человека, тип данных - character varying. region_name - название населенного пункта человека, тип данных - character varying. email - email человека, тип данных - character varying. phone - номер телефона человека, тип данных - character varying. photo - название фотографии человека, тип данных - character varying. status - системное название статуса человека, тип данных - character varying. name - имя человека, тип данных - character varying.В процессе разработки системы были описаны основные требования к ней, были выделены основные действующие лица, проведен анализ вариантов использования, разработаны диаграммы UML, а именно диаграмма вариантов использования, диаграмма классов, диаграмма компонентов, диаграмма размещения. Были разработаны классы работы базой данных Db.php, для загрузки страниц View.php, для работы с адресной строкой Uri.php, для работы с пользователем User.php, а также классы, реализующие шаблон проектирования «Цепочка обязанностей».

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

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

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

1. Разработка программных средств для информационной системы поиска человека в городе и в деревне с помощью шаблона «цепочка обязанностей»

1.1Анализ

1.1.1 Анализ предметной области

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

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

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

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

Рисунок 1 - Модель предметной области

1.1.2 Анализ функциональных требований

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

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

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

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

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

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

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

Краткое описание основных действующих лиц представлено в таблице 1.

Таблица 1 - Действующие лица

Название Профиль, подготовка и навыки

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

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

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

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

Таблица 2 - Краткое описание вариантов использования

Действующее лицо Название варианта использования Краткое описание варианта использования

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

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

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

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

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

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

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

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

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

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

Рисунок 2 - Начальная диаграмма вариантов использования

Составим подробное описание вариантов использования: Вариант использования: Авторизоваться

Краткое описание: пользователь авторизовывается на сайте

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

Основной сценарий: Клиент заходит на страницу авторизации.

Система запрашивает логин и пароль учетной записи пользователя.

Пользователь вводит необходимые данные.

Система проверяет корректность введенных данных.

Если данные введены корректно: Система авторизовывает пользователя.

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

Постусловия: Нет.

Альтернативные потоки: Нет.

Вариант использования: Использовать помощь

Краткое описание: пользователь пользуется информационной подсказкой системы

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

Основной сценарий: Клиент заходит на страницу Помощи, где он может узнать подробные возможности системы.

Постусловия: Нет.

Альтернативные потоки: Нет.

Вариант использования: Найти пользователя

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

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

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

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

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

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

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

Постусловия: Нет.

Альтернативные потоки: Нет.

Вариант использования: Выйти из системы

Краткое описание: пользователь выходит из системы

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

Основной сценарий: Авторизованный пользователь выбирает опцию Выйти из системы.

Система осуществляет выход пользователя из системы.

Система переводит пользователя в статус неавторизованного.

Постусловия: Нет.

Альтернативные потоки: Нет.

Вариант использования: Редактировать информацию

Краткое описание: администратор переходит на страницу редактирования информации о пользователе.

Действующие лица: администратор. администратор просматривает информацию о пользователе.

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

Администратор редактирует информацию.

Система сохраняет данные. Информация изменена.

Постусловия: Нет.

Альтернативные потоки: Нет.

1.1.3 Анализ нефункциональных требований

Система должна быть реализована для семейства операционных систем Windows.

Клиентская часть должна быть реализована на языке JAVASCRIPT и CSS, серверная часть приложения - на языке PHP 5.4, серверная часть БД - MYSQL Server, на котором будет создана реляционная база данных.

JAVASCRIPT - прототипно-ориентированный сценарный язык программирования. Является диалектом языка ECMASCRIPT.

CSS (англ. Cascading Style Sheets - каскадные таблицы стилей) - формальный язык описания внешнего вида документа, написанного с использованием языка разметки.

PHP (англ. PHP: Hypertext Preprocessor ) - скриптовый язык программирования общего назначения, интенсивно применяемый для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков программирования, применяющихся для создания динамических вебсайтов.

1.1.4 Анализ базовой архитектуры

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

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

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

1.1.5 Уточнение диаграммы вариантов использования

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

Можно заметить, что вариант использования «Найти человека» содержит в себе несколько подвариантов: «Выбрать параметры поиска», связанный с базой данных, и «Просмотреть результаты поиска». В свою очередь, вариант «Редактировать профиль» является подвариантом действия «Просмотреть результаты поиска» и связан с базой данных. Вариант «Удалить профиль» является подвариантом действия «Редактировать профиль» и также связан с базой данных.

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

Рисунок 3 - Уточнение диаграммы вариантов использования

1.2 Технология разработки ПО

1.2.1 Анализ шаблона проектирования «Цепочка обязанностей»

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

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

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

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

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

Рассмотрим шаблон «Цепочка обязанностей» подробнее.

Паттерн Chain of Responsibility

Название и классификация паттерна

Цепочка обязанностей - паттерн поведения объектов.

Назначение

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

Мотивация

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

Применимость

Удобно использовать цепочку обязанностей, когда: 1) есть более одного объекта, способного обработать запрос, причем настоящий обработчик заранее неизвестен и должен быть найден автоматически;

2) вы хотите отправить запрос одному из нескольких объектов, не указывая явно, какому именно;

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

Структура

Типичная структура объектов.

Паттерны поведения

Участники a Handler - обработчик: - определяет интерфейс для обработки запросов;

- (необязательно) реализует связь с преемником;

б CONCRETEHANDLER - конкретный обработчик: - обрабатывает запрос, за который отвечает;

- имеет доступ к своему преемнику;

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

в Client - клиент: - отправляет запрос некоторому объекту CONCRETEHANDLER в цепочке.

Отношения

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

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

1) ослабление связанности. Этот паттерн освобождает объект от необходимости «знать», кто конкретно обработает его запрос. Отправителю и получателю ничего неизвестно друг о друге, а включенному в цепочку объекту - о структуре цепочки. Таким образом, цепочка обязанностей помогает упростить взаимосвязи между объектами. Вместо того чтобы хранить ссылки на все объекты, которые могут стать получателями запроса, объект должен располагать информацией лишь о своем ближайшем преемнике;

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

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

Пример диаграммы классов шаблона «Цепочка обязанностей» представлен на рисунке 4.

Рисунок 4 - Пример диаграммы классов шаблона «Цепочка обязанностей»

1.2.2 Системные технологии

Для данного проекта был разработан фреймворк (англ. framework - каркас, структура) - структура программной системы; программное обеспечение, облегчающее разработку и объединение разных компонентов большого программного проекта. Классы фреймворка предназначены для работы с адресной строкой, системой, базой данных, пользователем. Описание классов, их назначение и описание функций представлено в таблице 3.

Таблица 3 - Описание классов фреймворка

Название класса Описание класса Основные функции

Db.php Класс для работы с базой данных. Хранит текущее соединение и позволяет легко выполнять различные запросы в базе. __construct - конструктор класса. Служит для инициализации переменных класса (имя базы данных и хоста, логина и пароля учетной записи). Connect - служит для установления соединения с базой данных. Query - служит для выполнения запросов к базе данных. Select - служит для выполнения запросов на выборку данных. SHOWLASTERROR - показывает последнюю ошибку , произошедшую в базе при выполнении запроса

System.php «Класс-контейнер» служит для хранения переменных сайта и объектов классов, инициализированных при загрузке фреймворка. Нужен для удобства обращения к объектам классов, а также для обеспечения сохранности данных при работе с объектами классов. Init - служит для загрузки конфигурации сайта и основных параметров. Get - получить значение по ключу Set - добавить или обновить значение по ключу.

View.php Класс служит для загрузки нужных папок и скриптов сайта __construct - конструктор класса. Служит для инициализации переменных класса LOADCSS - служит для загрузки файлов css LOADJS - служит для загрузки файлов js render - служит для загрузки необходимого файла (-ов) block - служит для загрузки блока данных, т.е. для повторяющегося элемента кода SHOWSYSTEMMESSAGE - служит для показа системных сообщений при успешном действии или при ошибке.

1.2.3 Модели UML

UML (англ. Unified Modeling Language) - язык графического описания для объектного моделирования в области разработки программного обеспечения . UML является языком широкого профиля, это - открытый стандарт , использующий графические обозначения для создания абстрактной модели системы , называемой UML-моделью. UML был создан для определения, визуализации, проектирования и документирования, в основном, программных систем.

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

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

Диаграмма вариантов использования (Use case diagram) - диаграмма, на которой отражены отношения, существующие между действующими лицами и вариантами использования .

Диаграмма компонентов (Component diagram) - статическая структурная диаграмма, показывает разбиение программной системы на структурные компоненты и связи (зависимости) между компонентами.

Диаграмма размещения (Deployment diagram) - моделирует физическое развертывание артефактов на узлах.

1.3 Проектирование

1.3.1 Проектирование интерфейса пользователя

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

Рисунок 5 - Страница авторизации

Рисунок 6 - Главная страница для неавторизованных пользователей

Рисунок 7 - Главная страница для авторизованных пользователей

Рисунок 8 - Страница «О системе»

Рисунок 9 - Страница настройки фильтров поиска

Рисунок 10 - Страница вывода результатов поиска

Рисунок 11 - Страница редактирования профиля

Рисунок 12 - Страница создания профиля

Условные обозначения: - Главное меню, элемент div

- Блок авторизации, элемент form

- Заголовок, элемент h

- Надписи, элемент label

- Поля для ввода данных, элемент input

- Кнопка, элемент button

- Текстовая информация, элемент div

- Блок авторизованных пользователей, элемент div

- Поле для выбора данных, элемент checkbox

- Поле для выбора данных, элемент select

- Блок для вывода личной информации, элемент div

- Блок для вывода контактной информации, элемент div

1.3.2 Проектирование ПО

Диаграмма классов, реализующих шаблон «Цепочка обязанностей», представлена на рисунке 13.

Рисунок 13 - Диаграмма классов

Как видно из диаграммы классов, загрузку приложения обеспечивают следующие классы: System, Db, Uri, User, View. Рассмотрим каждый из них подробнее.

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

Db - класс для работы с базой данных. Хранит текущее соединение и позволяет легко выполнять различные запросы в базе.

Uri - класс необходим для работы с адресной строкой, для разбора параметров, переданных в адресной строке.

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

View - класс служит для загрузки нужных скриптов сайта.

Подробное описание назначения классов и методов приведено в таблице 3 - Описание классов фреймворка.

Шаблон проектирования «Цепочка обязанностей» реализуют три класса.

Searcher - обработчик, который определяет интерфейс для обработки запросов. Содержит следующие методы: SETNEXT() - публичный метод, определяет следующего обработчика запроса. searh() - публичный метод, выполняет вызов функции запроса к базе данных для обработчика и, если таковой существует, поиск для следующего обработчика. GETPEOPLE() - публичный метод, возвращает массив с данными о найденных людях. SETPEOPLE() - защищенный метод, реализующий добавление информации о найденных пользователях. GETFROMDB() - абстрактный защищенный метод для формирования запроса к базе данных, для каждого обработчика свой.

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

Метод GETFROMDB() связан с классом Db, осуществляющим работу с базой данных.

Для загрузки обработчика запроса служит класс View. Данный скрипт принимает параметры поиска, заданные пользователем, обрабатывает их и вызывает метод класса GETPEOPLE() классов COUNTRYSEARCHER и CITIZENSEARCHER.

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

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

Рисунок 14 - Проектирование базы данных

Таблица users содержит следующие поля: id - уникальный идентификатор человека, первичный и уникальный ключ, тип данных - integer. is_citizen - флаг, определяющий, является ли человек горожанином (1 - горожанин, 0 - не горожанин). Тип данных - smallint. b_dt - дата рождения человека. Тип данных - timestamp without timezone sex - флаг, определяющий пол человека (1 - женщина, 0 - мужчина). Тип данных - smallint. nick - ник человека, тип данных - character varying. region_name - название населенного пункта человека, тип данных - character varying. email - email человека, тип данных - character varying. phone - номер телефона человека, тип данных - character varying. photo - название фотографии человека, тип данных - character varying. status - системное название статуса человека, тип данных - character varying. name - имя человека, тип данных - character varying.

1.4 Реализация

Диаграмма компонентов представлена на рисунке 15.

Рисунок 15 - Диаграмма компонентов

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

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

Скрипт index.php служит для начала работы приложения. Здесь определяются некоторые константы приложения, задаются параметры вывода ошибок на экран. По завершению работы скрипта управление передается на скрипт bootstrap.php.

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

Bootstrap.php вызывает класс - контейнер System.php, затем происходит подключение к базе данных с помощью класса Db.php. Подгружается класс работы с адресной строкой Uri.php, в котором определяется, какую страницу приложения необходимо показать. Вызов класса User.php также необходим для работы с пользователем, а именно для определения статуса пользователя, его прав доступа к элементам системы.

Наконец, класс View.php загружает необходимые скрипты для отображения нужной страницы. Это осуществляется с помощью метода render(), который и вызывается в bootstrap.php. render() загружает необходимые css-файлы, js-скрипты, оборачивающие шаблоны страниц, а затем и само содержимое страниц - content и template. Если запрашиваемая страница не найдена, происходит перенаправление на главную страницу.

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

Подробное описание классов приведено в таблице 3 - подробное описание классов фрейморка.

Код классов, реализующих шаблон «Цепочка обязанностей» и работу системы, их методов, а также код основных скриптов приведен в приложении А.

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

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

Рисунок 16 - Диаграмма размещения

1.5 Тестирование

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

Таблица 4 - Функциональные тесты приложения

Вариант использования Тест Результат тестирования

Авторизоваться Неавторизованный человек вводит логин и пароль для входа в систему. Введены корректные данные. Человек авторизуется в системе (рисунок 17)

Авторизоваться Неавторизованный человек вводит логин и пароль для входа в систему. Введены некорректные данные. Человек не авторизуется в системе, он видит ошибку (рисунок 18)

Авторизоваться Авторизованный человек пытается зайти на страницу авторизации. Система перенаправляет человека на главную страницу.

Выйти из системы Авторизованный человек выходит из системы, нажав на иконку «Выйти из системы». Человек выходит из системы.

Выбрать параметры поиска Человек заходит на страницу поиска и видит список настраиваемых фильтров для поиска. На странице настроек фильтров человек выбирает необходимые фильтры для поиска (рисунок 19)

Найти человека Человек выбирает параметры поиска. Система формирует запрос на выборку пользователей на основе фильтров, затем определяет статус человека (авторизованный, неавторизованный или администратор) и показывает соответствующие статусу данные о найденных людях или сообщение в случае, если ни один человек не найден Соответствует ожидаемому результату (рисунки 20, 21, 22, 23)

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

Вариант использования Тест Результат тестирования

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

Удалить профиль человека Никакой человек, кроме администратора, не может удалить профиль человек. Администратор видит ссылку для удаления профиль на странице редактирования. При нажатии на нее администратор должен подтвердить свой выбор. После удаления профиля человек видит, удачно или с ошибкой завершилось действие. Соответствует ожидаемому результату (рисунок 26, 27)

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

Рисунок 17 - Удачная авторизация

Рисунок 18 - Ошибка авторизации при неверном вводе логина или пароля

Рисунок 19 - Настройка фильтров поиска

Рисунок 20 - Показ результатов поиска для администратора

Рисунок 21 - Показ результатов поиска для неавторизованного пользователя

Рисунок 22 - Показ результатов поиска для авторизованного пользователя

Рисунок 23 - В результате поиска данных не найдено

Рисунок 24 - Редактирование профиля человека

Рисунок 25 - Результат редактирования данных человека

Рисунок 26 - Подтверждение запроса на удаление профиля человека

Рисунок 27 - Результат удаления данных человека

Рисунок 28 - Ввод данных человека

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

Были реализованы все функциональные и нефункциональные требования, а именно: авторизация, поиск человека, просмотр профилей, создание, редактирование, удаление профилей. Были разработаны классы работы базой данных Db.php, для загрузки страниц View.php, для работы с адресной строкой Uri.php, для работы с пользователем User.php, а также классы, реализующие шаблон проектирования «Цепочка обязанностей». Разработка была проверена на языках JAVASCRIPT, CSS, PHP 5.4, SQL.

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

Список литературы
«Приемы объектно-ориентированного проектирования. Паттерны проектирования», Эрих Гамма, Ричард Хелм, 2014г. http://www.ozon.ru/context/detail/id/2457392/

«Основы UML», М. Фаулер, 2009г. http://padabum.com/d.php?id=15515

«PHP 5», Д. Котеров, А. Костарев, 2010г. http://www.ozon.ru/context/detail/id/4030251/

«Изучаем PHP и MYSQL», М. Дэвис, Д. Филлипс, 2011г. http://padabum.com/d.php?id=15069

«Совершенный код», С. Макконнелл, 2007г. http://www.ozon.ru/context/detail/id/3159814/

«HTML5. Руководство разработчика», М.Пилгрим, 2013г. http://habrahabr.ru/company/piter/blog/162161/

«Большая книга CSS», Д. Макфарланд, 2011г. http://www.ozon.ru/context/detail/id/4265917/

«JQUERY. Подробное руководство по продвинутому Javascript», 2014г. http://www.ozon.ru/context/detail/id/6277333/

Приложение А. (обязательное)

Листинг программного кода index.php

<?php ini_set("display_errors", 1);

error_reporting(E_ALL);

define("INDEXPATH", realpath(dirname(__FILE__)) . "/" );

define("KERNELPATH", INDEXPATH . "e_kernel/");

define("SITEPATH", INDEXPATH . "sites");

define("FILEPATH", INDEXPATH . "files");

equire_once KERNELPATH . "bootstrap.php";

bootstrap.php

<?php require KERNELPATH."common.php";

spl_autoload_register("__autoload_classes");

System::init();

session_start();

System::set("db", new Db());

System::set("uri", new Uri());

System::set("user", new User());

System::set("view", new View());

System::get("view")->render();

common.php

<?php function __autoload_classes ($class) {

$dirs = array(

"lib/", );

foreach($dirs as $dir) { if(file_exists(KERNELPATH.$dir.$class.".php")) { require KERNELPATH.$dir.$class.".php";

return;

}

}

} function p($s) { echo "" . print_r($s, true) . "";

} function r($page) { header("Location: $page"); exit;

} function _post($key, $default = "") { return (isset($_POST[$key])) ? $_POST[$key] : $default;

} function _get($key, $default = "") { return (isset($_GET[$key])) ? $_GET[$key] : $default;

} function _session_get($key1, $key2="", $key3="")

{ if ($key3 != ""){ return (isset($_SESSION[$key1][$key2][$key3])) ? $_SESSION[$key1][$key2][$key3] : "";

}elseif ($key2 != ""){ return (isset($_SESSION[$key1][$key2])) ? $_SESSION[$key1][$key2] : "";

}elseif ($key1 != ""){ return (isset($_SESSION[$key1])) ? $_SESSION[$key1] : "";

}else return false;

} function _session_set($value, $key1="", $key2="", $key3="")

{ if ($key3 != ""){

$_SESSION[$key1][$key2][$key3] = $value;

} elseif($key2 != ""){

$_SESSION[$key1][$key2] = $value;

} elseif($key1 != ""){

$_SESSION[$key1] = $value;

} else {

$_SESSION = $value;

}

} config.php

<?php return array(

"APPNAME" => "Searcher", "DBLOGIN" => "root", "DBPASSWORD" => "", "DBHOST" => "localhost", "DBDATABASE" => "sandbox", "css" => array(

"", "", ""

), "js" => array(), "MAINLAYOUT" => "layout", "AUTHINFO" => array( array(

"login" => "admin", "password" => "admin", "role" => "Администратор"

), array(

"login" => "user", "password" => "user", "role" => "Пользователь"

)

), "MARITALSTATUS" => array(

"single" => "Свободен", "in_love" => "Влюблен", "married" => "Женат"

)

);

System.php

<?php class System

{ static $container = array();

public static function init() {

$config = include KERNELPATH . "config.php";

if (empty($config)) { die("Can not find site config");

} foreach ($config as $key => $val) { self::set($key, $val);

}

} public static function get($key) { return (isset(self::$container[$key])) ? self::$container[$key] : null;

} public static function set($key, $value) { return self::$container[$key] = $value;

}

}

Db.php

<?php class Db

{ public $login;

public $password;

public $hostname;

public $database;

private $active_db = false;

/**

* init some params

*/ public function __construct() {

$this->login = System::get("DBLOGIN");

$this->password = System::get("DBPASSWORD");

$this->hostname = System::get("DBHOST");

$this->database = System::get("DBDATABASE");

}

/**

* try connect to the db

* @return bool

*/ public function connect() { if ( !$this->active_db ) { mysql_connect($this->hostname, $this->login, $this->password);

$this->active_db = mysql_select_db($this->database);

if ( !$this->active_db ) { die("Error in connect to DB");

}

}

}

/**

* @param $query

* @return resource

*/ public function query($query) {

$this->connect();

return mysql_query($query);

} public function select($query) {

$RETURNRESULT = $this->query($query);

$RESULTDATA = array();

if ($RETURNRESULT) { for ($c=0; $c<mysql_num_rows($RETURNRESULT); $c ) {

$f = mysql_fetch_assoc($RETURNRESULT);

$RESULTDATA[] = $f;

}

} return $RESULTDATA;

} public function SHOWLASTERROR() { return mysql_error();

}

}

Uri.php

<?php class Uri

{ public $site;

public $uri_clean_string;

public $uri_string;

public $uri = array();

public function __construct() { if(isset($_SERVER["HTTP_HOST"])) {

$this->site = strtolower($_SERVER["HTTP_HOST"]);

}

$params = array();

$uri = "";

$filter_uri = "_0-9a-z\.\-";

if(isset($_SERVER["REQUEST_URI"])) {

$uri = parse_url($_SERVER["REQUEST_URI"]);

foreach(explode("/", $uri["path"]) as $val) { if(!preg_match("/[^".$filter_uri."]/i", $val)) { if(!empty($val)) {

$params[] = str_replace(".php", "", $val);

}elseif($val=="0" and count($params)>1) {

$params[] = $val;

}

}

}

}

$this->SETURI($params);

$this->CLEANURI();

} public function SETURI($uri) {

$this->uri_clean_string = strtolower(implode("/", $uri));

if(empty($uri)) {

$uri[] = "index";

}else { foreach($uri as $k=>$v) {

$uri[$k] = strtolower($v);

}

} if(!isset($uri[1])) {

$uri[] = "index";

}

$this->uri = $uri;

$this->uri_string = implode("/", $this->uri);

}

/**

* @desc Преобразовывает адресную строку (без /index)

* @param string $uri

* @return string

*/ public function CLEANURI()

{

$uri = $this->uri_string;

if(strlen($uri) > 1 and substr($uri, -1) == "/") {

$uri = substr($uri, 0, -1);

} if(substr($uri, 0, 1) != "/") {

$uri = "/" . $uri;

}

$uri = str_replace("/index", "", $uri);

if(empty($uri)) {

$uri = "/";

} return $uri;

}

}

User.php

<?php class User

{ public $role = false;

function CHECKAUTH() { return (isset($_SESSION["user"]) && !empty($_SESSION["user"]));

} function login($INPUTLOGIN, $INPUTPASSWORD) {

$SEARCHDATA = array(

"login"=> trim($INPUTLOGIN), "password"=> trim($INPUTPASSWORD)

);

$CHECKDATA = $this->CHECKUSERREG($SEARCHDATA);

if ($CHECKDATA) {

$_SESSION["user"] = array(

"login" => $CHECKDATA["login"], "role" => $CHECKDATA["role"]

);

return true;

} return false;

} function logout() {

_session_set(array(), "");

} function CHECKUSERREG ($data) {

$auth_info = System::get("AUTHINFO");

foreach ($auth_info as $auth) { if ($data["password"] == $auth["password"] && $data["login"] == $auth["login"]) {

$this->role = $auth["role"];

return $auth;

}

} return false;

} function ISLOGGEDIN() { return $this->CHECKAUTH();

} function GETROLE() { if ($this->role) { return $this->role;

} if (isset($_SESSION["user"]["role"])) { return $_SESSION["user"]["role"];

} return false;

} function ISADMIN() { return (isset($_SESSION["user"]["login"]) && $_SESSION["user"]["login"] == "admin");

}

}

View.php

<?php class View

{ public $content;

private $Uri;

public function __construct() {

$this->Uri = System::get("uri")->uri;

} function LOADCSS() { echo implode(PHP_EOL, System::get("css"));

} function LOADJS() { echo implode(PHP_EOL, System::get("js"));

} public function render() {

$uri = System::get("uri")->uri;

$file_path = implode("/",$uri);

$PHPPATH = SITEPATH."/content/".$file_path.".php";

$TPLPATH = SITEPATH."/templates/".$file_path.".tpl.php";

if (!is_file($PHPPATH)) { r(SITEPATH . "/errors/error404");

} ob_get_clean();

ob_start();

include $PHPPATH;

if (is_file($TPLPATH)) { include $TPLPATH;

}

$this->content = ob_get_clean();

if ($uri[0]=="actions") { echo $this->content;

} else { include SITEPATH."/layouts/" . System::get("MAINLAYOUT") . ".tpl.php";

echo ob_get_clean();

}

} public function block($filename) {

$BLOCKPATH = SITEPATH."/templates/blocks/".$filename.".tpl.php";

ob_start();

if (is_file($BLOCKPATH)) { include $BLOCKPATH;

}

$result = ob_get_clean();

return $result;

} public function SHOWSYSTEMMESSAGE() {

$message = "";

if ( isset($_SESSION["message"]) ) { foreach ( $_SESSION["message"] as $type => $value ) {

$message .= "".$value."";

}

} unset($_SESSION["message"]);

return $message;

}

}

Searcher.php

<?php abstract class Searcher { protected $people = array();

/** @var Searcher */ protected $next;

public function SETNEXT(Searcher $search) {

$this->next = $search;

return $search;

} public function search($search_params) {

$this->GETFROMDB($search_params);

if (!empty($this->next)) {

$this->next->GETFROMDB($search_params);

}

} public function GETPEOPLE() { return $this->people;

} protected function SETPEOPLE($info) { if ( !empty($info) ) {

$this->people = $info;

}

} protected abstract function GETFROMDB($search_params);

}

CITIZENSEARCHER.php

<?php class CITIZENSEARCHER extends Searcher { protected function GETFROMDB($search_params) {

$query = "

SELECT *

FROM users

{$search_params}

AND is_citizen = 1

ORDER BY name

";

$result = (System::get("db")->select($query)) ? System::get("db")->select($query) : array();

$this->SETPEOPLE($result);

}

}

COUNTRYSEARCHER.php

<?php class COUNTRYSEARCHER extends Searcher { protected function GETFROMDB($search_params) {

$query = "

SELECT *

FROM users

{$search_params}

AND is_citizen = 0

ORDER BY name

";

$result = (System::get("db")->select($query)) ? System::get("db")->select($query) : array();

$this->SETPEOPLE($result);

}

}

Формирование запроса и вызов классов шаблона «Цепочка обязанностей»

<?php if (empty($_GET)) { r("/search");

}

$where = array();

if ( _get("name", false) ) {

$where[] = "name = "" . _get("name") . """;

}

$where[] = "sex in (" . implode(",", _get("sex", array())) . ")";

if ( _get("status") != "all" ) {

$where[] = "status = "" . _get("status", "") . """;

} if ( _get("region_name", false) ) {

$where[] = "region_name = "" . _get("region_name") . """;

}

$WHERESTR = " WHERE " . implode(" AND ", $where);

$citizen = new CITIZENSEARCHER();

$country = $citizen->SETNEXT(new COUNTRYSEARCHER());

$citizen->search($WHERESTR);

$this->RESULTSEARCH = array(

"citizen" => $citizen->GETPEOPLE(), "country" => $country->GETPEOPLE(), );

$this->count = count($this->RESULTSEARCH["citizen"]) count($this->RESULTSEARCH["country"]);

Авторизация

ISLOGGEDIN()) {r("/");}if (!empty($_POST)) {if ( !System::get("user")->login(trim(_post("login")), trim(_post("password"))) ) {$_SESSION["message"] = array("error" => "Вы ввели неверный логин или пароль");r("/auth");}r("/");}

Редактирование профиля

<?php if ( !System::get("user")->ISLOGGEDIN() || !System::get("user")->ISADMIN() ) { r("/");

} if (!empty($_POST)) {

$name = _post("name", "");

$nick = _post("nick", "");

$b_dt = date("Y-m-d 00:00:00", strtotime(_post("b_dt", date("d.m.Y"))));

$region_name = _post("region_name", "");

$is_citizen = (int)_post("is_citizen", "");

$sex = (int)_post("sex", "");

$status = _post("status", "");

$email = _post("email", "");

$phone = _post("phone", "");

$photo = _post("photo", "");

$id = _post("id", 0);

$query = "

UPDATE users

SET name = "{$name}", nick = "{$nick}", b_dt = "{$b_dt}", region_name = "{$region_name}", is_citizen = "{$is_citizen}", sex = "{$sex}", status = "{$status}", email = "{$email}", phone = "{$phone}", photo = "{$photo}"

WHERE id = {$id};

";

$update = System::get("db")->query($query);

if (!$update) {

$_SESSION["message"] = array(

"error" => "Произошла ошибка при обновлении профайла пользователя." . System::get("db")->SHOWLASTERROR()

);

} else {

$_SESSION["message"] = array(

"success" => "Обновление данных прошло успешно!"

);

}

} r("/profile");

Удаление профиля

<?php if ( !System::get("user")->ISLOGGEDIN() || !System::get("user")->ISADMIN() || !isset($_GET["id"]) ) { r("/");

}

$query = "DELETE FROM users WHERE id = " . $_GET["id"];

$delete = System::get("db")->query($query);

if (!$delete) {

$_SESSION["message"] = array(

"error" => "Произошла ошибка при удалении профайла пользователя." . System::get("db")->SHOWLASTERROR()

);

} else {

$_SESSION["message"] = array(

"success" => "Удаление данных прошло успешно!"

);

} r("/profile");

Создание профиля

<?php if ( !System::get("user")->ISLOGGEDIN() ) { r("/");

} if (!empty($_POST)) {

$name = _post("name", "");

$nick = _post("nick", "");

$b_dt = date("Y-m-d 00:00:00", strtotime(_post("b_dt", date("d.m.Y"))));

$region_name = _post("region_name", "");

$is_citizen = (int)_post("is_citizen", "");

$sex = (int)_post("sex", "");

$status = _post("status", "");

$email = _post("email", "");

$phone = _post("phone", "");

$photo = _post("photo", "");

$IDARRAY = System::get("db")->select("SELECT id FROM users ORDER BY id DESC LIMIT 1;");

$uid = $IDARRAY[0]["id"] 1;

$query = "

INSERT INTO users

(id, name, nick, b_dt, region_name, is_citizen, sex, status, email, phone, photo)

VALUES

({$uid}, "{$name}", "{$nick}", "{$b_dt}", "{$region_name}", "{$is_citizen}", "{$sex}", "{$status}", "{$email}", "{$phone}", "{$photo}");

";

$insert = System::get("db")->query($query);

if (!$insert) {

$_SESSION["message"] = array(

"error" => "Произошла ошибка при добавлении профайла пользователя." . System::get("db")->SHOWLASTERROR()

);

} else {

$_SESSION["message"] = array(

"success" => "Сохранение данных прошло успешно!"

);

} r("/profile");

}

Размещено на

Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность
своей работы


Новые загруженные работы

Дисциплины научных работ





Хотите, перезвоним вам?