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

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 07.08.2018
Размер файла 988,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

2.3 Сравнительный анализ интегрированных сред разработки

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

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

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

Популярность и размер комьюнити

Устойчивость

Поддержка

Технические приёмы

Документация

2.3.1 CakePHP 3

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

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

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

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

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

Имена таблиц будут заданы во множественном числе

Имя поля первичного ключа будет id

Имена полей внешних ключей будут основаны на соответствующих именах таблиц с последующим добавлением _id

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

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

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

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

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

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

Основным моментом здесь является то, что до CakePHP 3, ORM получала бы, по умолчанию, любые связанные таблицы при выполнении запроса.

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

Вот некоторые полезные Хелперы:

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

NumberHelper: предоставляет удобные методы для отображения чисел в различных общепринятых (или собственных) форматах и с разной степенью точности.

CakePHP -- это целостное и самодостаточное решение для веб-разработки. База исходного кода является завершенной, а функциональные возможности кажутся безграничными. В общем, CakePHP был создан, чтобы сделать процесс веб-разработки быстрым, что является важным не только для самих разработчиков, но и для заказчиков[10].

2.3.2 Zend Framework

Zend Framework -- это коллекция профессиональных пакетов PHP с более чем 126 миллионами установок. Он может использоваться для разработки веб-приложений и сервисов с использованием PHP 5.6+ и предоставляет объектно-ориентированный код, используя широкий спектр языковых функций.

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

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

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

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

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

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

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

Благодаря множеству компонентов, сложности, и полностью объектно-ориентированному подходу, Zend Framework весьма трудоемок в освоении, несколько облегчает процесс полнота документации и развитое сообщество. Кроме того, существует огромное количество блогов, которые содержат различные советы, посвященные Zend Framework[11].

2.3.3 Yii

Yii -- это высокоэффективный, основанный на компонентной структуре PHP-фреймворк для разработки веб-приложений. Он позволяет максимально применить концепцию повторного использования кода и может существенно ускорить процесс веб-разработки. Фреймворк является бесплатным программным обеспечением и распространяется как «New BSD License».

Он призывает к чистому написанию кода, без лишних связанностей, принципу DRY (don't repeat yourself) направленный на снижение повторения кода, событийно-ориентированное программирование, когда выполнение подпрограммы определяется исходя из события запущенного пользователем, соглашение по конфигурации, по которому если класс соответствует соглашению наименованию, тогда он не нуждается в дополнительной конфигурации, а так же модульная структура приложения. Для фреймворка уже разработано много библиотек, виджетов и расширений как основными, так и сторонними разработчиками. Это все позволяет быстро разрабатывать качественные приложения. Сразу из коробки реализована отложенная загрузка, это позволяет загружать и исполнять только те компоненты, которые нужны для выполнения запроса. Можно увеличить производительность за счет применения различных техник кеширования.

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

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

Фреймворк базируется на паттерне проектирования MVC, для моделей используется Active Record. Для вывода информации во View есть варианты использования шаблонизаторов Smatry или Twig, также можно использовать сам PHP как шаблонизатор, он прекрасно с этим справляется. Контроллеры могут содержать действия (actions), поведения (behaviors) а так же другие функции. Их задача организовать взаимодействие моделей и представлений. Работать со связанными данными становится очень просто и интуитивно понятно, если использовать ActiveRecord. Не придется писать множество запросов, множество строк SQL кода, заботится о синтаксисе при работе с конкретной СУБД. Используя ActiveRecord можно составлять сложные запросы, выстраивать связи между различными базами данных.

В базовом (basic) и расширенном (advanced) шаблонах уже реализованы базовые функции пользователя: методы регистрации, авторизации и аутентификации, сброс пароля. RBAC (Role Based Access Control) позволяет реализовывать расширенные схемы авторизации. Можно разграничить доступ для множества групп (например, администраторы, модераторы, редакторы) пользователей.

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

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

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

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

2.3.4 NetBeans IDE

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

NetBeans - это гораздо больше, чем просто текстовый редактор. В редакторе NetBeans обрабатываются отступы линий, сопоставляются слова и скобки, а также выделяется исходный код как синтаксически, так и семантически. Он также предоставляет шаблоны кода, советы по написанию кода и инструменты реорганизации. Редактор поддерживает множество языков - Java, C / C++, XML и HTML, PHP, Groovy, Javadoc, JavaScript и JSP. Редактор является расширяемым, поэтому можно подключить поддержку для множества других языков.

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

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

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

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

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

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

Программирование на PHP, поддержка всех сопутствующих языков программирования, технологий и веб-стандартов. Возможность создавать проекты PHP на основе различных платформ. Редактор PHP динамически интегрирован с функциями редактирования HTML, JavaScript и CSS. Проекты PHP могут быть развёрнуты из среды NetBeans на локальном или удаленном сервере при взаимодействии через FTP или SFTP.

Возможность создания, тестирования, отладки и внедрения приложений, функционирующих на мобильных телефонах, карманных компьютерах, телеприставках и встраиваемых системах. Visual Mobile Designer (VMD) создает всю необходимую модульную инфраструктуру проекта и обеспечивает быструю разработку графических интерфейсов путём перетаскивания в рабочую область компонентов - экран ожидания, экран входа в систему, обозреватель файлов, средство составления сообщений SMS и экран заставки. Возможность создания пользовательского интерфейса на основе SVG.

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

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

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

3. Разработка информационной системы

3.1 Описание исходного кода системы

Класс regDB системы:

Class regDB extends mysqli {

}

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

Эти методы условно можно изобразить следующим образом:

Public function name_method(parametrs) {

return $this->query(«код на mysql»);

}

Данный метод возвращает результат запроса к базе данных и всю полученную информацию записывает в переменную где данный метод был вызван. $result = regDB::getInstance()->name_method(parametrs);

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

Для примера работы метода можно привести следующий листинг кода:

Publicfunctionextraction_phone($start,$per_page,$full_name,$email,$work_phone,$mobile_phone) {

Return $this->query("SELECT id,full_name,email,work_phone,mobile_phone FROM phone WHERE full_name LIKE '%$full_name%' AND email LIKE '%$email%' AND work_phone LIKE '%$work_phone%' AND mobile_phone LIKE '%$mobile_phone%' LIMIT $start,$per_page");

}

Представленный метод извлекает информацию из таблицы «phone». И вся информация передается переменной $result:

$result = regDB::getInstance()->extraction_phone($start,$per_page,$_SESSION['full_name'],$_SESSION['email'],$_SESSION['work_phone'],$_SESSION['mobile_phone']);

Далее с помощью цикла while на странице формируется таблица с информацией записанной в массие $result.

while($row = mysqli_fetch_array($result)):

echo "<tr><td>".$num++."</td>";

echo "<td>". htmlentities($row['full_name']). "</td>";

echo "<td>". htmlentities($row['email']). "</td>";

echo "<td>". htmlentities($row['work_phone']). "</td>";

if ($check_user["right_personal"] == "+") {echo "<td>". htmlentities($row['mobile_phone']). "</td>";}

echo "</tr>\n";

ENDWHILE;

Для реализации механизма авторизации пользователей в системе использовался подход, основанный на переменных сессии.

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

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

По умолчанию PHP использует внутренний обработчик files для сохранения сессий, который установлен в INI-переменной session.save_handler. Этот обработчик сохраняет данные на сервере в директории, указанной в конфигурационной директиве session.save_path.

Сессии могут запускаться вручную с помощью функции session_start(). Если директива session.auto_startустановлена в 1, сессия автоматически запустится, в начале запроса.

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

Пример кода реализующий авторизацию пользователя приведен ниже:

public function verify($name, $password){

$name = $this->real_escape_string($name);

$password = $this->real_escape_string($password);

$result = $this->query("SELECT 1 FROM users

WHERE user_name = '". $name. "' AND user_password = '". $password. "'");

return $result->data_seek(0);

}

if ($_SERVER['REQUEST_METHOD'] == "POST") {

$logonSuccess = (regDB::getInstance()->verify($_POST['user_name'], $_POST['user_password']));

if ($logonSuccess == true) {

session_start();

$_SESSION['user'] = $_POST['user_name'];

header('Location:home.php');

exit;

}

}

информационная система администрация

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

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

session_start();

if (!array_key_exists("user", $_SESSION)) {

header('Location: auth.php');

exit;

}

Данный код присутствует на каждой странице системы и если в массиве переменных, нет переменной "user", происходит перенаправление на страницу авторизации. Выход из системы реализуется очисткой из сессии переменной «user». В коде это выглядит так: unset($_SESSION['user']);

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

Для примера приведен код с переменными необходимыми для поиска документов:

If (isset($_POST['doc_view'])) $_SESSION['doc_view']=$_POST['doc_view'];

If (isset($_POST['description'])) $_SESSION['description']=$_POST['description'];

if (isset($_POST['doc_number'])) $_SESSION['doc_number']=$_POST['doc_number'];

if (isset($_POST['date_accept'])) $_SESSION['date_accept']=$_POST['date_accept'];

if (isset($_POST['date_publish'])) $_SESSION['date_publish']=$_POST['date_publish'];

if (isset($_POST['year_accept'])) $_SESSION['year_accept']=$_POST['year_accept'];

if (isset($_POST['year_accept1'])) $_SESSION['year_accept1']=$_POST['year_accept1'];

if (isset($_POST['month_accept'])) $_SESSION['month_accept']=$_POST['month_accept'];

if (isset($_POST['month_accept1'])) $_SESSION['month_accept1']=$_POST['month_accept1'];

if (isset($_POST['year_publish'])) $_SESSION['year_publish']=$_POST['year_publish'];

if (isset($_POST['year_publish1'])) $_SESSION['year_publish1']=$_POST['year_publish1'];

if (isset($_POST['month_publish'])) $_SESSION['month_publish']=$_POST['month_publish'];

if (isset($_POST['month_publish1'])) $_SESSION['month_publish1']=$_POST['month_publish1'];

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

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

$uploaddir = "C:/xampp/htdocs/registry/uploads/decrees/";

$uploadfile = $uploaddir.basename($_FILES['uploadfile']['name']);

copy($_FILES['uploadfile']['tmp_name'], $uploadfile);

В переменной $uploaddir указан путь к директории сохранения архива. В $uploadfile полный путь к самому сохраняемому архиву. С помощью функции copy() происходит копирование загруженного файла из временной директории в директорию указанной в $uploaddir. Одновременно с этим происходит запись полного имени файла в базу данных.

Для скачивания архива приведен код:

$file=$_GET['file'];

header ("Content-Type: application/octet-stream");

header ("Accept-Ranges: bytes");

header ("Content-Length: ".filesize($file));

header ("Content-Disposition: attachment; filename=".basename($file));

readfile($file);

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

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

if ($num_pages > $limiter) {

if ($page+1 <= $limiter-2) {

$i=1;

for($i;$i<=$limiter;$i++) {

if ($i-1 == $page) {

echo "<b>".$i."&nbsp</b>";

} else {

echo '<a href="decrees.php?page='.$i.'">'.$i."</a> &nbsp";

}

}

echo '...<a href="decrees.php?page='.$num_pages.'">'.$num_pages."</a>";

}

else if (($page+1 > $limiter-2) && ($page+1 <= ($num_pages-3))) {

$i=($page+1)-3;

echo '<a href="decrees.php?page=1">1</a>...';

for($i;$i<=$page+3;$i++) {

if ($i-1 == $page) {

echo "<b>".$i."&nbsp</b>";

} else {

echo '<a href="decrees.php?page='.$i.'">'.$i."</a> &nbsp";

}

}

echo '...<a href="decrees.php?page='.$num_pages.'">'.$num_pages."</a>";

}

else if ($page+1 > $num_pages-3 && $page+1 <= ($num_pages)) {

$i=$num_pages-$limiter+1;

echo '<a href="decrees.php?page=1">1</a>...';

for($i;$i<=$num_pages;$i++) {

if ($i-1 == $page) {

echo "<b>".$i."&nbsp</b>";

} else {

echo '<a href="decrees.php?page='.$i.'">'.$i."</a> &nbsp";

}

}

}

}

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

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

$check=regDB::getInstance()->user_rights($_SESSION["user"]);

$check_user=mysqli_fetch_array($check);

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

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

БД состоит из следующих таблиц:

decrees - информация о документах постановлений:

id, тип - integer. Первичный ключ;

doc_view, тип - varchar. Вид документа;

description, тип - text. Наименование документа;

doc_number, тип - varchar. Номер документа;

date_accept, тип - date. Дата принятия документа;

date_publish, тип - date. Дата опубликования документа;

file, тип - text. Наименование файла документа для скачивания.

Рис. 3.1 - Структура таблицы decrees

instructions - информация о документах распоряжений;

id, тип - integer. Первичный ключ;

doc_view, тип - varchar. Вид документа;

description, тип - text. Наименование документа;

doc_number, тип - varchar. Номер документа;

date_accept, тип - date. Дата принятия документа;

date_publish, тип - date. Дата опубликования документа;

file, тип - text. Наименование файла документа для скачивания.

Рис. 3.2 - Структура таблицы instructions

solutions - информация о документах решений совета депутатов;

id, тип - integer. Первичный ключ;

doc_view, тип - varchar. Вид документа;

description, тип - text. Наименование документа;

doc_number, тип - varchar. Номер документа;

date_accept, тип - date. Дата принятия документа;

date_publish, тип - date. Дата опубликования документа;

file, тип - text. Наименование файла документа для скачивания.

Рис. 3.3 - Структура таблицы solutions

phone - информация о телефонном справочнике;

id, тип - integer. Первичный ключ;

full_name, тип - varchar. ФИО;

email, тип - varchar. Адрес электронной почты;

work_phone, тип - varchar. Номер телефона (рабочий);

mobile_phone, тип - varchar. Номер телефона (сотовый);

Рис. 3.4 - Структура таблицы phone

staff - информация о штатном расписании;

id, тип - integer. Первичный ключ;

position, тип - varchar. Должность;

full_name, тип - varchar. ФИО;

dob, тип - date. Дата рождения;

organization, тип - text. Организация.

Рис. 3.5 - Структура таблицы staff

users - информация о пользователях системы;

id, тип - integer. Первичный ключ;

user_name, тип - text. Имя пользователя;

user_password, тип - text. Пароль;

right_add, тип - varchar. Категория прав на добавление;

right_edit, тип - varchar. Категория прав на изменение;

right_del, тип - varchar. Категория прав на удаление;

right_personal, тип - varchar. Категория прав на личную информацию.

Рис. 3.6 - Структура таблицы users

3.2 Разработка интерфейса системы

Интерфейс страницы авторизации представлен следующим образом:

Рис. 3.7 - Страница авторизации информационной системы

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

Интерфейс главной страницы выглядит так:

Рис. 3.8 - Главная страница информационной системы

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

Интерфейс страницы «Постановления»:

Рис. 3.9 - Раздел «Постановления» информационной системы

Кнопка «Главная страница» реализует переход на главную страницу, также она отображается во всех разделах данной информационной системы. Далее расположен фильтр поиска документа. Данный фильтр находит документы по соответствующим критериям. Реализована возможность поиска по годам и месяцам, как по дате принятия, так и по дате опубликования документа. Отображение опций «Добавить», «Изменить», «Удалить», происходит в соответствии с правами пользователя. Различные приложения к конкретному документу в формате текстовых документов (их может быть достаточно большое количество) будут храниться в.rar архиве, и ссылки на этот архив расположены в соответствующих ячейках таблицы, в столбце «Файл». Опции «Добавить» и «Изменить» открывают страницу, где есть возможность добавить или изменить документ, в зависимости от того какая опция была выбрана. Следует отметить реализацию постраничного вывода информации, для удобного её представления.

Интерфейс разделов «Распоряжения» и «Решения Совета Депутатов» представлен по аналогии с интерфейсом описанным выше.

Интерфейс страницы редактирования или добавления:

Рис. 3.10 - Страница редактирования данных соответствующего раздела

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

Интерфейс раздела «Телефонный справочник»:

Рис. 3.11 - Раздел «Телефонный справочник» информационной системы

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

Интерфейс раздела «Штатное расписание»:

Рис. 3.12 - Раздел «Штатное расписание» информационной системы

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

Интерфейс раздела «Пользователи»:

Рис. 3.13 - Раздел «Пользователи» информационной системы

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

Заключение

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

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

Интерфейс системы получился интуитивно понятным, простым. Для освоения данной системы потребуется немного времени.

В настоящий момент система обладает следующими возможностями:

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

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

Добавление и редактирование всей необходимой информации.

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

Список использованных источников

1. Васильев, А.А. Муниципальное управление: конспект лекций [Текст] / А.А. Васильев - Н. Новгород: Гладкова О.В., 2000. - 160 с.

2. Яновский, В.В. Государственное и муниципальное управление [Текст] / В.В. Яновский - М.: Кнорус, 2013. - 200 с.

3. Современный учебник JavaScript [Электронный ресурс] / Илья Кантор. - 2017. - Режим доступа: https://learn.javascript.ru/, свободный. - Загл. с экрана.

4. Язык программирования Ruby [Электронный ресурс] / Сообщество Ruby. - 2016. - Режим доступа: https://www.ruby-lang.org/ru/, свободный. - Загл. с экрана.

5. Python [Электронный ресурс] / Python software foundation. - 2017. - Режим доступа: https://www.python.org/, свободный. - Загл. с экрана.

6. Мазуркевич, А.В. PHP: настольная книга программиста [Текст] / А.В. Мазуркевич, Д.И. Еловой - Санкт-Петербург: BHV, 2004. - 479c.

7. FreeBSD Project [Электронный ресурс] / The FreeBSD Project. - 2014. - Режим доступа: https://www.freebsd.org/ru/, свободный. - Загл. с экрана.

8. CentOS Project [Электронный ресурс] / The CentOS Project. - 2017. - Режим доступа: https://www.centos.org/, свободный. - Загл. с экрана.

9. Ubuntu [Электронный ресурс] / Canonical group ltd. -2013. - Режим доступа: https://www.ubuntu.com/, свободный. - Загл. с экрана.

10. CakePHP - Build fast, grow solid | PHP Framework | Home [Электронный ресурс] / Cake Software Foundation. - 2017. - Режим доступа: https://cakephp.org/, свободный. - Загл. с экрана.

11. Zend framework: Home [Электронный ресурс] / Zend, a rogue wave company. - 2017. - Режим доступа: https://framework.zend.com/, свободный. - Загл. с экрана.

12. Yii PHP Framework [Электронный ресурс] / Yii software LLC. - 2017. - Режим доступа: http://www.yiiframework.com/, свободный. - Загл. с экрана.

13. NetBeans IDE [Электронный ресурс] / Oracle Corporation and/or its affiliates. - 2017. - Режим доступа: https://netbeans.org/, свободный. - Загл. С экрана.

14. Робин, Н. Learning PHP, MySQL, JavaScript, CSS and HTML5: A step-by-step Guide to creating dynamic websites [Текст] / Н. Робин - Санкт-Петербург: Питер, 2015. - 688 с.

15. Мержевич, В.А. HTML и CSS на примерах [Текст] / В.А. Мержевич - Санкт-Петербург: БХВ-Петербург, 2005. - 306 с.

Приложение А

Исходный код системы

db.php

<?php

class regDB extends mysqli {

private static $instance = null;

private $user = "root";

private $pass = "";

private $dbName = "registry";

private $dbHost = "localhost";

public static function getInstance() {

if (!self::$instance instanceof self) {

self::$instance = new self;

}

return self::$instance;

}

public function __clone() {

trigger_error('Clone is not allowed.', E_USER_ERROR);

}

public function __wakeup() {

trigger_error('Deserializing is not allowed.', E_USER_ERROR);

}

public function __construct() {

parent::__construct($this->dbHost, $this->user, $this->pass, $this->dbName);

if (mysqli_connect_error()) {

exit('Connect Error ('. mysqli_connect_errno(). ') '

. mysqli_connect_error());

}

parent::set_charset('UTF-8');

}

/*---------------------------------------------DECREES--------------*/

Public function extraction($start,$per_page,$doc_view,$description,$doc_number,$date_accept,$year_accept,$year_accept1,$month_accept,$month_accept1,$date_publish,$year_publish,$year_publish1,$month_publish,$month_publish1) {

if ($date_accept == "") {$date_accept1="IS NOT NULL";} else if($date_accept!= "") {$date_accept1="='$date_accept'";}

if ($date_publish == "") {$date_publish1="IS NOT NULL";} else if($date_publish!= "") {$date_publish1="='$date_publish'";}

if ($month_accept == "-" && $month_accept1 == "-") {$month_accept2="IS NOT NULL";} else if ($month_accept!= "-" && $month_accept1 == "-"){$month_accept2="BETWEEN $month_accept AND $month_accept";} else if ($month_accept!= "-" && $month_accept1!= "-") {$month_accept2="BETWEEN $month_accept AND $month_accept1";}

if ($year_accept == "" && $year_accept1 == "") {$year_accept2="IS NOT NULL";} else if ($year_accept!= "" && $year_accept1 == ""){$year_accept2="BETWEEN $year_accept AND $year_accept";} else if ($year_accept!= "" && $year_accept1!= "") {$year_accept2="BETWEEN $year_accept AND $year_accept1";}

if ($month_publish == "-" && $month_publish1 == "-") {$month_publish2="IS NOT NULL";} else if ($month_publish!= "-" && $month_publish1 == "-"){$month_publish2="BETWEEN $month_publish AND $month_publish";} else if ($month_publish!= "-" && $month_publish1!= "-") {$month_publish2="BETWEEN $month_publish AND $month_publish1";}

if ($year_publish == "" && $year_publish1 == "") {$year_publish2="IS NOT NULL";} else if ($year_publish!= "" && $year_publish1 == ""){$year_publish2="BETWEEN $year_publish AND $year_publish";} else if ($year_publish!= "" && $year_publish1!= "") {$year_publish2="BETWEEN $year_publish AND $year_publish1";}

return $this->query("SELECT id,doc_view,description,doc_number,date_accept,date_publish,file FROM decrees WHERE doc_view LIKE '%$doc_view%' AND description LIKE '%$description%' AND doc_number LIKE '%$doc_number%' AND date_accept $date_accept1 AND MONTH(date_accept) $month_accept2 AND YEAR(date_accept) $year_accept2 AND date_publish $date_publish1 AND MONTH(date_publish) $month_publish2 AND YEAR(date_publish) $year_publish2 LIMIT $start,$per_page");

}

public function extraction_count($doc_view,$description,$doc_number,$date_accept,$year_accept,$year_accept1,$month_accept,$month_accept1,$date_publish,$year_publish,$year_publish1,$month_publish,$month_publish1) {

if ($date_accept == "") {$date_accept1="IS NOT NULL";} else if($date_accept!= "") {$date_accept1="='$date_accept'";}

if ($date_publish == "") {$date_publish1="IS NOT NULL";} else if($date_publish!= "") {$date_publish1="='$date_publish'";}

if ($month_accept == "-" && $month_accept1 == "-") {$month_accept2="IS NOT NULL";} else if ($month_accept!= "-" && $month_accept1 == "-"){$month_accept2="BETWEEN $month_accept AND $month_accept";} else if ($month_accept!= "-" && $month_accept1!= "-") {$month_accept2="BETWEEN $month_accept AND $month_accept1";}

if ($year_accept == "" && $year_accept1 == "") {$year_accept2="IS NOT NULL";} else if ($year_accept!= "" && $year_accept1 == ""){$year_accept2="BETWEEN $year_accept AND $year_accept";} else if ($year_accept!= "" && $year_accept1!= "") {$year_accept2="BETWEEN $year_accept AND $year_accept1";}

if ($month_publish == "-" && $month_publish1 == "-") {$month_publish2="IS NOT NULL";} else if ($month_publish!= "-" && $month_publish1 == "-"){$month_publish2="BETWEEN $month_publish AND $month_publish";} else if ($month_publish!= "-" && $month_publish1!= "-") {$month_publish2="BETWEEN $month_publish AND $month_publish1";}

if ($year_publish == "" && $year_publish1 == "") {$year_publish2="IS NOT NULL";} else if ($year_publish!= "" && $year_publish1 == ""){$year_publish2="BETWEEN $year_publish AND $year_publish";} else if ($year_publish!= "" && $year_publish1!= "") {$year_publish2="BETWEEN $year_publish AND $year_publish1";}

return $this->query("SELECT count(*) FROM decrees WHERE doc_view LIKE '%$doc_view%' AND description LIKE '%$description%' AND doc_number LIKE '%$doc_number%' AND date_accept $date_accept1 AND MONTH(date_accept) $month_accept2 AND YEAR(date_accept) $year_accept2 AND date_publish $date_publish1 AND MONTH(date_publish) $month_publish2 AND YEAR(date_publish) $year_publish2");}

public function update_decrees($id,$doc_view,$description,$doc_number,$date_accept,$date_publish,$file_name){

$this->query("UPDATE decrees SET doc_view = '$doc_view', description = '$description', doc_number = '$doc_number',date_accept = '$date_accept',date_publish = '$date_publish', file = '$file_name' WHERE id = '$id'");

}

public function edit_decrees($id){

return $this->query("SELECT id,doc_view,description,doc_number,date_accept,date_publish,file FROM decrees WHERE id='$id'");

}

public function insert_decrees($doc_view,$description,$doc_number,$date_accept,$date_publish,$file_name) {

$this->query("INSERT INTO decrees (doc_view,description,doc_number,date_accept,date_publish,file) VALUES ('$doc_view','$description','$doc_number','$date_accept','$date_publish','$file_name')");

}

public function delete_decrees($id) {

$this->query("DELETE FROM decrees WHERE id='$id' ");

}

/*---------------------------------------INSTRUCTIONS---------------*/

public function extraction_instructions($start,$per_page,$doc_view,$description,$doc_number,$date_accept,$year_accept,$year_accept1,$month_accept,$month_accept1,$date_publish,$year_publish,$year_publish1,$month_publish,$month_publish1) {

if ($date_accept == "") {$date_accept1="IS NOT NULL";} else if($date_accept!= "") {$date_accept1="='$date_accept'";}

if ($date_publish == "") {$date_publish1="IS NOT NULL";} else if($date_publish!= "") {$date_publish1="='$date_publish'";}

if ($month_accept == "-" && $month_accept1 == "-") {$month_accept2="IS NOT NULL";} else if ($month_accept!= "-" && $month_accept1 == "-"){$month_accept2="BETWEEN $month_accept AND $month_accept";} else if ($month_accept!= "-" && $month_accept1!= "-") {$month_accept2="BETWEEN $month_accept AND $month_accept1";}

if ($year_accept == "" && $year_accept1 == "") {$year_accept2="IS NOT NULL";} else if ($year_accept!= "" && $year_accept1 == ""){$year_accept2="BETWEEN $year_accept AND $year_accept";} else if ($year_accept!= "" && $year_accept1!= "") {$year_accept2="BETWEEN $year_accept AND $year_accept1";}

if ($month_publish == "-" && $month_publish1 == "-") {$month_publish2="IS NOT NULL";} else if ($month_publish!= "-" && $month_publish1 == "-"){$month_publish2="BETWEEN $month_publish AND $month_publish";} else if ($month_publish!= "-" && $month_publish1!= "-") {$month_publish2="BETWEEN $month_publish AND $month_publish1";}

if ($year_publish == "" && $year_publish1 == "") {$year_publish2="IS NOT NULL";} else if ($year_publish!= "" && $year_publish1 == ""){$year_publish2="BETWEEN $year_publish AND $year_publish";} else if

($year_publish!= "" && $year_publish1!= "") {$year_publish2="BETWEEN $year_publish AND $year_publish1";}

return $this->query("SELECT id,doc_view,description,doc_number,date_accept,date_publish,file FROM instructions WHERE doc_view LIKE '%$doc_view%' AND description LIKE '%$description%' AND doc_number LIKE '%$doc_number%' AND date_accept $date_accept1 AND MONTH(date_accept)

$month_accept2 AND YEAR(date_accept) $year_accept2 AND date_publish $date_publish1 AND MONTH(date_publish) $month_publish2 AND YEAR(date_publish) $year_publish2 LIMIT $start,$per_page");

}

public function extraction_count_instructions($doc_view,$description,$doc_number,$date_accept,$year_accept,$year_accept1,$month_accept,$month_accept1,$date_publish,$year_publish,$year_publish1,$month_publish,$month_publish1) {

if ($date_accept == "") {$date_accept1="IS NOT NULL";} else if($date_accept!= "") {$date_accept1="='$date_accept'";}

if ($date_publish == "") {$date_publish1="IS NOT NULL";} else if($date_publish!= "") {$date_publish1="='$date_publish'";}

if ($month_accept == "-" && $month_accept1 == "-") {$month_accept2="IS NOT NULL";} else if ($month_accept!= "-" && $month_accept1 == "-"){$month_accept2="BETWEEN $month_accept AND $month_accept";} else if ($month_accept!= "-" && $month_accept1!= "-") {$month_accept2="BETWEEN $month_accept AND $month_accept1";}

if ($year_accept == "" && $year_accept1 == "") {$year_accept2="IS NOT NULL";} else if ($year_accept!= "" && $year_accept1 == ""){$year_accept2="BETWEEN $year_accept AND $year_accept";} else if ($year_accept!= "" && $year_accept1!= "") {$year_accept2="BETWEEN $year_accept AND $year_accept1";}

if ($month_publish == "-" && $month_publish1 == "-") {$month_publish2="IS NOT NULL";} else if ($month_publish!= "-" && $month_publish1 == "-"){$month_publish2="BETWEEN $month_publish AND $month_publish";} else if ($month_publish!= "-" && $month_publish1!= "-") {$month_publish2="BETWEEN $month_publish AND $month_publish1";}

if ($year_publish == "" && $year_publish1 == "") {$year_publish2="IS NOT NULL";} else if ($year_publish!= "" && $year_publish1 == ""){$year_publish2="BETWEEN $year_publish AND $year_publish";} else if ($year_publish!= "" && $year_publish1!= "") {$year_publish2="BETWEEN $year_publish AND $year_publish1";}

return $this->query("SELECT count(*) FROM instructions WHERE doc_view LIKE '%$doc_view%' AND description LIKE '%$description%' AND doc_number LIKE '%$doc_number%' AND date_accept $date_accept1 AND MONTH(date_accept) $month_accept2 AND YEAR(date_accept) $year_accept2 AND date_publish $date_publish1 AND MONTH(date_publish) $month_publish2 AND YEAR(date_publish) $year_publish2");

}

public function update_instructions($id,$doc_view,$description,$doc_number,$date_accept,$date_publish,$file_name){

$this->query("UPDATE instructions SET doc_view = '$doc_view', description = '$description', doc_number = '$doc_number',date_accept = '$date_accept',date_publish = '$date_publish',file = '$file_name' WHERE id = '$id'");

}

public function edit_instructions($id){


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.