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

 

ОГЛАВЛЕНИЕ


ВВЕДЕНИЕ

. СИСТЕМНЫЙ АНАЛИЗ

.1 Актуальность задачи

.2 Выбор средств разработки

.3 Выбор базы данных

.4 Описание работы информационной системы

.5 Анализ существующих программных продуктов

.6 Постановка задачи

. СИСТЕМНОЕ ПРОЕКТИРОВАНИЕ

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

.2 Обоснование выбора архитектуры базы данных и СУБД

.2.1 Выбор архитектуры базы данных

.2.2 Обоснование выбора СУБД

.3 Разработка мер по защите информации

.4 Моделирование потоков данных (DFD диаграмм)

.5 Проектирование инфологической модели данных с использованием модели «сущность-связь»

. ТЕХНИЧЕСКОЕ ПРОЕКТИРОВАНИЕ

.1 Выбор web-сервера

.2 Технология ASP.NETMVC 4

.3 Технология JavaScript

.4 Физическое моделирование системы

.5 Комплекс необходимых программных средств

.6 Функции, используемые в системе агентства недвижимости

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

. ОРГАНИЗАЦИОННО-ЭКОНОМИЧЕСКАЯ ЧАСТЬ

.1 Технико-экономическое обоснование необходимости разработки информационно - аналитической системы агентства недвижимости «Центр жилья»

.2 Планирование разработки

.2.1 Календарное планирование

.2.2 Организационный, юридический и финансовый аспекты разработки

.3 Стоимостная оценка проекта

.4 Формирование цены разработки

.5 Анализ экономической целесообразности внедрения объекта проектирования

. БЕЗОПАСНОСТЬ ЖИЗНЕДЕЯТЕЛЬНОСТИ

ЗАКЛЮЧЕНИЕ

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

ПРИЛОЖЕНИЕ А. ЛИСТИНГ ПРОГРАММЫ


ВВЕДЕНИЕ


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

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


1. СИСТЕМНЫЙ АНАЛИЗ


.1 Актуальность задачи


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

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

2)Перенос части работы агентства по поиску подходящих вариантов на пользователя: он сам ищет подходящее объявление, а агенту сообщает лишь номер этого объявления.

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


.2 Выбор средств разработки


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

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

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

При разработке любого приложения важную роль играет удобство отладки и поиска ошибок;

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

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

MVC (Model-view-controller, «Модель-представление-поведение») - схема использования нескольких шаблонов проектирования <#"justify">.3 Выбор базы данных


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

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

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

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

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

-не гибкий дизайн логической структуры;

2.Метод запросов. Запрос - это формализованный способ выражения информационных потребностей пользователем системы. Методы запросов:

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

-независимость от конкретной СУБД. Несмотря на наличие диалектов и различий в синтаксисе, в большинстве своём тексты SQL-запросов могут быть достаточно легко перенесены из одной СУБД в другую;

-декларативность. С помощью SQL программист описывает только то, какие данные нужно извлечь или модифицировать. То, каким образом это сделать, решает СУБД непосредственно при обработке SQL-запроса;

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

TSQL - имеет ряд дополнительных возможностей по сравнению с SQL:

-управляющие операторы;

-локальные и глобальные переменные;

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

поддержка аутентификации Microsoft Windows;

3.Манипулирование наборами данных на сервере.

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

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

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

4.Поддерживаемые операционные системы - является важным критерием, так как возможность установки сервера на операционной системе семейства Unix влияет на стоимость использования системы и на защищённость системы от возможных атак;

5.Лицензия - влияет на конечную стоимость продукта;

.Модель хранения данных:

-реляционная таблица. Каждая реляционная таблица представляет собой двумерный массив и обладает следующими свойствами:

-каждый элемент таблицы - один элемент данных;

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

каждый столбец имеет уникальное имя;

одинаковые строки в таблице отсутствуют;

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

-JSON (англ. JavaScript Object Notation) - текстовый формат обмена данными, основанный на JavaScript. За счёт своей лаконичности по сравнению с XML, формат JSON может быть более подходящим для сериализации сложных структур. Если говорить о веб-приложениях, в таком ключе он уместен в задачах обмена данными как между браузером и сервером, так и между самими серверами. Формат JSON также хорошо подходит для хранения сложных динамических структур в реляционных базах данных или файловом кэше;

-BSON (англ. Binary JavaScript Object Notation) это компьютерный формат обмена данными. Это бинарная форма представления простых структур данных и ассоциативных массивов(которые называют объектами или документами). В сравнении с JSON, BSON является эффективным как в плане размера хранения данных, так и сканирования. Большие элементы в документе BSON имеют префикс с длинной документа для облегчения сканирования;

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

Выдвинутым требованиям удовлетворяет многим известная СУБД MSSQL. Она будет использована для работы с базой данных. Непосредственно для извлечения и сохранения данных будет использоваться EntityFramework, который позволяет работать с базой данных даже без SQLзапросов, посредством linqзапросов. Хотя в конечном итоге linqзапрос представляет собой SQLзапрос, программисту нет необходимости составлять SQLзапрос, хотя знать этот язык нужно для составления linqзапросов, так как они похожи между собой.

1.4 Описание работы информационной системы


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

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

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

На верхней панели будет расположена кнопка «Инфо», при клике на которую можно будет просмотреть информацию об агентстве, агентах, работниках, руководстве, и т.д.

Кроме основной таблицы, в базе данных будут таблицы-справочники. Они будут содержать информацию о районах в городе, типах недвижимости и т.д. В таких таблицах будет всего 2 поля: ID и Name. Все идентификаторы во всей базе данных будут типа GUID (Globally Unique Identifier). Это статистически <#"justify">{6F9619FF-8B86-D011-B42D-00CF4FC964FF}


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


.5 Анализ существующих программных продуктов


Аналогичные проекты:

1)В Новочеркасске существует агентство недвижимости «Давиденко и Ко». Его сайт расположен по адресу <#"justify">Здесь мы видим слева панель для связи с работниками агентства, справа - весь основной интерфейс. Имеется возможность выбора типа недвижимости: квартира, дом, гараж, гостинка, комната в коммуналке, дача, малосемейка, часть дома, земельный участок, коммерческие объекты. Также можно выбрать ориентировочную цену, кол-во комнат, ориентир. Говоря о ползунке количества комнат, можно сказать, что верхняя граница его чересчур завышена, так как 260 комнат в доме или квартире трудно даже представить, не говоря уже о необходимости такого поиска. Далее, при клике по любому из типов недвижимости сразу можно увидеть все результаты для соответствующего типа, что вполне логично. Это показано на рисунке 2.


Рис. 1. Интерфейс сайта АН «Давиденко и Ко».


Рис 2. Результат поиска квартиры в АН «Давиденко и Ко»


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

2)Агентство недвижимости «Ключ-Н». Почему-то данное агентство имеет сайт, названием никак не связанный с названием агентства. Сайт доступен по адресу <#"justify">

Рис 3. Интерфейс сайта АН «Ключ-Н»


Трудно себе представить более неудачный интерфейс. Чтобы узнать, как им пользоваться, нужно прочитать инструкцию, которая «висит» на главной странице. Выбор типа недвижимости, района, кол-ва комнат - все это перепутано вместе, и пользоваться этим совершенно невозможно. Однако, это еще не самый главный недостаток. Справа расположена панель выбора квартир. Если опуститься примерно на 1,5-2 экрана вниз, где заканчивается панель с инструкцией, список выбора квартир все еще длится. Это показано на рисунке 4.


Рис 4. Расположение панелей на сайте АН «Ключ-Н».


Кроме того, внизу расположена еще одна бесполезная панель «Архивы». Если опуститься вниз, туда где закончится и эта панель, список выбора квартир все еще будет длиться. Длится он примерно на 10 экранов вниз. Для достаточно известного агентства недвижимости такой сайт - это непозволительный промах.

3)Сайт «slando». Его раздел для Новочеркасска расположен по адресу <#"justify">

Рис 5. Интерфейс сайта «slando.ru».


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


.6 Постановка задачи


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

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

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

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

Разрабатываемый программный интерфейс работника агентства должен предоставлять возможность:

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

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

Программный интерфейс обычного пользователя должен предоставлять возможность:

Искать походящее объявление;

-Оставить заявку на осмотр квартиры с агентом;

Программный интерфейс зарегистрированного пользователя должен предоставлять возможность:

Просматривать те же данные, что и обычный пользователь;

Разместить объявление на сайте

Программный интерфейс администратора системы должен предоставлять возможность:

-Управлять информацией в БД.

Приложение должно находиться на хостинге, поддерживающем приложения с архитектурой MVC4, а также СУБД MSSQL.


2. СИСТЕМНОЕ ПРОЕКТИРОВАНИЕ


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


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

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

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

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

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

система разделения ролей;

аутентификация и авторизация на сайте;

ведение базы данных

поиск объявлений;

размещение и редавтирование объявлений в системе.

Все перечисленные функции система выполняет, опираясь на базу данных. Архитектура «клиент - сервер» предоставляет удаленный доступ к базе. Используется тонкий клиент, что позволяет не использовать стороннее ПО клиентами, работниками, администраторами.

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

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

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

-управление доступом к базе данных и другими требованиями защиты;

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

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

предоставление интерфейса для работы с данными.

Клиентское приложение - это часть системы, которую пользователь использует для взаимодействия с данными. Клиентские приложения в СУБД клиент-сервер выполняют следующие задачи:

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

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

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

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

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

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

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


Рис 2.1. Функциональная схема информационно-аналитической системы


Система организует работу с объявлениями, которые могут быть размещены любым зарегистрированным пользователем. Кроме того, любой пользователь, вне зависимости от пройденной аутентификации, может искать объявления по заданным критериям. При выводе результатов поиска, каждое объявление проверяется на предмет авторства. Иначе говоря, если найденное объявление размещено пользователем, который в тукущий момент времени осуществляет поиск, то будут показаны дополнительные кнопки, позволяющие редактировать или удалить объявление. Даже если недопущенный к редактированию пользователь попытается отредактировать объявление, эта ситуация будет отловлена и предотвращена. В системе используется нестандартный способ разделения ролей. В базе данных в таблице пользователей каждому из них назначена роль, в соответствии с которой формируется внешний вид страницы. Например, обычному пользователю недоступны данные, которые предназначены для работника и администратора. По умолчанию новым пользователям назначается роль «RegisteredUser». Она позволяет размещать объявления в системе. Чтобы получить роль работника или администратора, нужно при регистрации или изменении данных ввести специальный код, который назначит роль пользователю. При создании объявления, в базу данных кроме основной информации записывается время его создания, благодаря чему возможен вывод на главной странице последних добавленных объявлений. Если нажать на их фотографию, то можно просмотреть информацию об этом объявлении. При отображении результатов поиска может быть изменен порядок вывода. Для этого нужно нажать на заголовок таблицы вывода на ту колонку, по которой нужно осуществить сортировку. На данный момент возможна только сортировка по возрастанию.

На рисунке 2.2 представлена блок-схема алгоритма работы информационно-аналитической системы.

Рис 2.2. Блок-схема алгоритма работы системы.


.2 Обоснование выбора архитектуры базы данных и СУБД


.2.1 Выбор архитектуры базы данных

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

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

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

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

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


Рис 2.3. Блок-схема алгоритма работы взаимодействия клиента и сервера.


К преимуществам клиент-серверной архитектуры:

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

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

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

Недостатки:

неработоспособность сервера может сделать неработоспособной всю вычислительную сеть;

поддержка работы данной системы требует отдельного специалиста - системного администратора;

высокая стоимость оборудования.

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

Достоинства:

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

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

предоставляет возможность работы даже при обрывах связи с сервером;

имеет возможность подключения к базамбез использования сети Интернет;

высокое быстродействие.

Недостатки:

большой размер дистрибутива;

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

при работе с ним возникают проблемы с удаленным доступом к данным;

довольно сложный процесс установки и настройки;

сложность обновления и связанная с ней неактуальность данных;

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

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

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

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

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

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

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

-Сервер базы данных обеспечивает хранение данных и выносится на третий уровень. Обычно это стандартная реляционная или объектно-ориентированная СУБД.

По сравнению с клиент-серверной или файл-серверной архитектурой можно выделить следующие достоинства трёхуровневой архитектуры:

масштабируемость;

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

высокая безопасность;

высокая надёжность;

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

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

Недостатки вытекают из достоинств:

более высокая сложность создания приложений;

сложнее в разворачивании и администрировании;

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

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

Схема взаимодействия клиента и серверов приведена на рисунке 2.4.


.2.2 Обоснование выбора СУБД

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


Рис 2.4. Схема взаимодействия клиента и серверов.


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

Реляционные системы берут свое начало в математической теории множеств. Они были предложены в конце 1968 года доктором Э.Ф.Коддом из фирмы IBM, который первым осознал, что можно использовать математику для придания надежной основы и строгости области управления базами данных.

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

Достоинства реляционной модели:

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

При проектировании реляционной БД применяются строгие правила, базирующие на математическом аппарате.

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

Для построения запросов и написания прикладных программ нет необходимости знания конкретной организации БД во внешней памяти.

Недостатки реляционной модели

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

Далеко не всегда предметную область можно представить в виде совокупности таблиц.

Так же, нужно отметить более серьезную проблему реляционных БД.

Хотя они и обеспечивают наилучшую смесь простоты, устойчивости, гибкости, производительности, масштабируемости и совместимости, их показатели по каждому из этих пунктов не обязательно выше, чем у аналогичных систем, ориентированных на какую-то одну особенность. Это не являлось большой проблемой, поскольку всеобщее доминирование реляционных СУБД перевешивало какие-либо недочеты. Тем не менее, если обычные РБД не отвечали потребностям, всегда существовали альтернативы. Сегодня ситуация немного другая. Разнообразие приложений растет, а с ним растет и важность перечисленных особенностей. И с ростом количества баз данных, одна особенность начинает затмевать все другие. Это масштабируемость. Поскольку все больше приложений работают в условиях высокой нагрузки, например, таких как веб-сервисы, их требования к масштабируемости могут очень быстро меняться и сильно расти. Первую проблему может быть очень сложно разрешить, если у вас есть реляционная БД, расположенная на собственном сервере. Предположим, нагрузка на сервер за ночь увеличилась втрое. Как быстро появится возможностьобновить железо? Решение второй проблемы также вызывает трудности в случае использования реляционных БД.

Реляционные БД хорошо масштабируются только в том случае, если располагаются на единственном сервере. Когда ресурсы этого сервера закончатся, необходимо будет добавить больше машин и распределить нагрузку между ними. И вот тут сложность реляционных БД начинает играть против масштабируемости. Если попробовать увеличить количество серверов не до нескольких штук, а до сотни или тысячи, сложность возрастет на порядок, и характеристики, которые делают реляционные БД такими привлекательными, стремительно снижают к нулю шансы использовать их в качестве платформы для больших распределенных систем.

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

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


.3 Разработка мер по защите информации


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

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

Наиболее распространенной хеш-функцией является md5:

vardata = "Hello World";hash = md5(data);.Show(hash); // b10a8db164e0754105b7a99be72e3fe5(англ.MessageDigest 5) - это алгоритм хеширования (128-битный). В 1991 году он был разработан Рональдом Л. Ривестом (профессор Массачусетского технологического института).Результатом применения md5 всегда будет строка из 32 символов в шестнадцатеричном виде. Технически хеш может быть 128-битным. В функцию md5() можно поместить числа и строки любой длины, но результат на выходе будет в 32 символа. Это подтверждает односторонность функции.

Поэтапный процесс регистрации:

-заполнение формы регистрации с полем «пароль» пользователем;

-помещение внесенных данных в базу скриптом-обработчиком;

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

Нигде не применяется оригинальное значение пароля.

Поэтапный процесс входа в систему:

-ввод пользователем логина и пароля;

-хеширование этого пароля скриптом-обработчиком;

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

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

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

Коллизией хеш-функции является равенство значений хеш-функции на различных двух блоках данных. То есть, когда при хешировании двух разного типа данных выходит один результат, возникает коллизия. На это оказывает влияние используемая функция. Например, функция crc32() возвращает в качестве результата 32-битное целое. Значит, возможно только 232 (4 294 967296) вероятных вариантов на выходе.

Хешируем пароль:

echocrc32('supersecretpassword');

// навыходе: 323322056

Допустим, база данных вместе с этим паролем стала доступна для злоумышленников. Они не могут преобразовать 323322056 в «supersecretpassword», но используя простой скрипт, они легко подберут другой пароль, имеющий точно такой же хешированный вид как у нашего пароля:

set_time_limit(0);

$i = 0;(true) {(crc32(base64_encode($i)) == 323322056) {base64_encode($i);;

}

$i++;

}

Через какое-то время скрипт вернет строку «MTIxMjY5MTAwNg==», которую можно будет использовать вместо «supersecretpassword» и получить возможность входа в систему под именем настоящего владельца пароля.

echo crc32('supersecretpassword');

// навыходе: 323322056

echo crc32('MTIxMjY5MTAwNg==');

// навыходе: 323322056

Любой, даже самый простой, домашний компьютер дает возможность использования в секунду миллиардов хеш-функций. Значит надо подобрать хеш-функцию с наибольшей генерацией значений в секунду. Подойдет md5, она способна генерировать 128-битные хеши. Вариантов подбора будет значительно больше (2128). Пройтись по всем итерациям, чтобы найти коллизии станет практически невозможно.Sha1() возвращает 160-битный хеш и является хорошей альтернативой md5.

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

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

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

$password = "easypassword";

// такой пароль может найтись в Радужной таблице

// т.к. пароль содержит два распространённых словаsha1($password); // 6c94d3b42518febd4ad747801d50a8972022f956

// для соли используем любое количество случайных символов

$salt = "f#@V)Hu^%Hgfds";

// такой хэш никогда не будет найден в Радужных таблицах

echo sha1($salt . $password);

// cd56a16759623378628c0d9336af69b74d9d71a5

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

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

Например, хеш-строки «easypassword» есть в первоначальной радужной таблице. В новой таблице с учетом «соли» будет значение «f#@V)Hu^%Hgfdseasypassword». При запуске скрипта некоторые совпадения наверняка будут.

Для защиты можно использовать «уникальную соль», различную для каждого пользователя. Чтобы «соль» стала уникальной, добавим id пользователя:

$hash = sha1($user_id . $password);

Само собой, id пользователя будет неизменным. Можно для каждого пользователя сгенерировать случайную строку и также получить уникальную «соль». Хранить эту «соль» надо вместе с записью о пользователе:

// сгенерируем строку длиной 22 символа

functionunique_salt() {

return substr(sha1(mt_rand()),0,22);

}

$unique_salt = unique_salt();

$hash = sha1($unique_salt . $password);

// сохраним $unique_salt в записи пользователя

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

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

Допустим, если пароль состоит из цифр, из прописных, заглавных букв, то это всего 62 (26+26+10)возможных символов.Пароль из 8 символов включает в себя 628 вариантов комбинаций, то есть немного больше 218 триллионов. При обработке в секунду одного миллиарда хешей за 60 часов злоумышленники подберут пароль. Ну, а для пароля из 6 символов на эту процедуру уйдет чуть более минуты. Следовательно, требование от пользователей введения 9-10-значного пароля будет вполне обоснованным.


.4 Моделирование потоков данных (DFD диаграмм)

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

Диаграмма потоков данных (data flow diagram, DFD) - один из основных инструментов структурного анализа и проектирования информационных систем, существовавших до широкого распространения UML. Несмотря на имеющее место в современных условиях, смещение акцентов от структурного к объектно-ориентированному подходу к анализу и проектированию систем, «старинные» структурные нотации по-прежнему широко и эффективно используются в анализе информационных систем.

Исторически сложилось так, что для описания диаграмм DFD используются две нотации - Йодана (Yourdon) и Гейна-Сарсона (Gane-Sarson), отличающиеся синтаксисом.

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

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

Кроме того, нотация DFD поддерживает понятие подсистемы - структурной компоненты разрабатываемой системы.

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

На рисунке 2.5 показана DFD диаграмма системы АН.


.5 Проектирование инфологической модели данных с использованием модели «сущность-связь»


Данная диаграмма «сущность-связь» строится при помощи использования графических обозначений, приведенных в таблице. Такое представление данных имеет тип диаграммы ER(ERD).


Таблица 2.1. Графические обозначения ER-диаграммы.

сущностьассоциация (связь)атрибут сущности

Рис 2.5. DFD диаграмма подсистемы онлайн консультаций


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

Более полной является формальная базовая реляционная модель, разработанная Е. Коддом, для которой модель сущность-связь можно считать основой.

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

-Квартира;

-Тип;

-Район;

-Адрес;

-Пользователь;

-Клиент;

-Статус;

-Файл;

-Лог.

У каждой сущности есть атрибут, который называется «id». Он используется только для работы самой системы и скрыт от глаз пользователей. Он представляет собой Guid, информация о котором была приведена в главе 1. В связи с этим, не будем перечислять этот атрибут у каждой сущности.

Сущность «Квартира» описывает объявление об аренде и содержит информацию о нем. Данная сущность имеет следующие атрибуты:

-Тип:idтипа недвижимости (квартира, дом, дача, гараж и т.д.);

-Район: idрайона для недвижимости;

-Кол-во комнат;

-Без хозяев;

-Посуточно: возможность посуточного съема квартиры;

-Цена;

-Описание: комментарий к объявлению;

-Регистратор: idпользователя, зарегистрировавшего данное объявление.

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

-Дата добавления;

-Статус: id статуса для недвижимости (сдана, сдается и т.д.);

-Клиент: id клиента, который снял данную недвижимость.

Сущность «Тип» является справочником и описывает типы недвижимости. Помимо атрибута id содержит атрибут «Название», в который записывается название типа недвижимости в том виде, который будет показан в списке типов.

Кроме справочника типов, есть также справочник «Статус», который содержит один атрибут «Название».

Сущность «Район» является справочником районов недвижимости и содержит следующие атрибуты:

Название;

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

Сущность «Адрес» содержит множество адресов для недвижимости. У этой сущности идентификатор совпадает с идентификатором сущности «Квартира», то есть связть «один к одному». Содержит следующие атрибуты:

Область;

Район;

Город;

Улица;

Дом;

Квартира.

Сущность «Пользователь» содержит информацию обо всех зарегистрированных пользователях системы. Имеет следующие атрибуты:

Логин;

Пароль: пароль в зашифрованном виде;

Почта: электронная почта пользователя;

Дата регистрации;

Роль: роль пользователя в системе;

Телефон;

Дата последнего логина: когда пользователь заходил последний раз в систему;

Активирован: прошел ли пользователь активацию после регистрации;

Заблокирован;

Дата выхода из системы;

Не в системе;

Комментарий;

Фамилия;

Имя;

Отчество;

Год рождения.

Сущность «Клиент» содержит информацию о клиенте, который снял недвижимость. Имеет следующие атрибуты:

Фамилия;

Имя;

Отчество;

Дата рождения;

Телефон.

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

-Idэкземпляра: идентификатор объявления, к которому прикреплен данный файл;

Путь к папке с файлом;

Имя файла.

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

Дата добавления;

Сообщение: текст ошибки или иной произошедшей ситуации.

Диаграмма «сущность-связь» для информационно-аналитической системы приведена на рисунке 2.6, а логическая модель данных - на рисунке 2.7.


Рисунок 2.6. Диаграмма «сущность-связь» подсистемы онлайн консультаций

Рисунок 2.7. Логическая модель данных


3. ТЕХНИЧЕСКОЕ ПРОЕКТИРОВАНИЕ


.1 Выбор web-сервера


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

1.Доступ.

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

При синхронном выполнении эти операции будут выполняться друг за другом последовательно, каждый раз ожидая завершения предыдущей. При асинхронном доступе мы имеем возможность отправить запросы к СУБД «параллельно». Асинхронный фреймворк не дожидается результата работы предыдущего запроса, чтобы отправить следующий. Временем отправки запроса, по сравнению со временем его работы, при этом можно пренебречь. Таким образом, общее время работы с данными будет приблизительно равно времени работы самого долгого запроса + небольшой промежуток времени на отправку запросов и обработку их результатов. Но в любом случае это будет быстрее, чем сумма времени выполнения всех запросов при их последовательной обработке;

2.Язык клиента совпадает с языком сервера - упрощает разработку приложения, так как позволяет использовать одни и те же решения и на клиентской и на серверной стороне;

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

4.Поддерживаемые операционные системы - является важным критерием, так как возможность установки сервера на операционной системе семейства Unix влияет на стоимость использования системы и на защищённость системы от возможных атак;

5.Лицензия - влияет на конечную стоимость продукта;

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

Исходя из перечисленных характеристик, можно остановиться на двух web-серверах: apache и iis. Последний используется преимущественно для операционных систем семейства Windows, в то время как Apache разработан для Unix систем, но существует и под Windows. Несмотря на это, будет использован IIS, так как информационная система написана на ASPNETMVC на ОС Windows, и для размещения сайта больше подойдет предназначенный специально для этой ОС web-сервер. Устанавливается он из меню «Включение компонетов Windows». Установлен он будет только для тестирования, так как в дальнейшем сайт будет размещен на хостинге, который уже имеет свой веб-сервер. Чтобы использовать личный компьютер в роли веб-сервера, нужно иметь выделенный провайдером белый ip-адрес, который стоит дополнительных денег помимо абонентской платы за интернет, либо проброшенный порт 80, что невозможно, так как он используется провайдерами в своих интересах. Вдобавок, для этого нужно стабильное интернет-соединение, которое не может быть обеспечено имеющимися провайдерами. В любом случае придется платить еще и за доменное имя, так что проще использовать готовый веб-хостинг для размещения сайта.

Исходя из требований к поддержке технологии ASPNETMVC, остановимся на веб-хостинге somee.com. Он поддерживает MVC, а также MSSQL. Кроме того, он имеет пробный бесплатный период 30 дней, чего вполне хватит для тестирования информационной системы агентства. Для размещения сайта можно использовать средства публикации MSVisualStudio. При использовании этого способа на Windows 8 есть проблема доступа к FTP-серверу, поэтому следует использовать любой доступный FTP-клиент (осуществить публикацию на локальный диск, а уже с него скопировать файлы на сервер).


.2 Технология ASP.NETMVC 4

.NETMVCFramework -фреймворк для создания веб-приложений, который реализует шаблон Model-view-controller. Данный фреймворк добавлен Microsoft в ASP.NET.

Model-view-controller (MVC, «Модель - представление - поведение», «Модель-представление-контроллер») - схема использования нескольких шаблонов проектирования <#"176" src="doc_zip13.jpg" />

Рис. 3.1. Иллюстрация архитектуры MVC.


На рисунке 3.1 показана схема шаблона MVC. Пользователь взаимодейтсвует с контроллером, который, по сути, является главным обработчиком пользовательских действий. Контроллер, в свою очередь, основан на модели данных. Эта модель содержит набор данных, необходимый для описания задачи, которую решает приложение. Например, модель данных «Пользователь» содержит поля «Логин», «Пароль», «Дата регистрации», «Почта», «Телефон», «Год рождения» и т.д. Эти поля описывают данные, с помощью которых описывается профиль пользователя, и не содержат лишней информации. Данные из модели могут быть записаны в базу данных. Для этого в приложении используется контекст данных для использования фреймворка «Entity», который позволяет легко запрашивать и добавлять данные в базу. Контекст в случае ASP.NETMVC похож на модель данных, но описывается немного по-другому, и содержит точно те же поля, которые есть в базе данных. «EntityFramework» позволяет использовать любую реляционную базу данных, так как в его составе есть достаточно мощные инструменты для работы с различными СУБД. Благодаря этому можно, при наличии достаточного опыта, перейти с использования одной СУБД на другую, например, с MSSQLна MySQL, которая является бесплатной.

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

3.3 Технология JavaScript

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

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

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

Несмотря на схожий синтаксис с языком C, JavaScript имеет коренные отличия:

-объекты, с возможностью интроспекции;

-функции как объекты первого класса;

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

-автоматическая сборка мусора;

-анонимные функции.

В языке отсутствуют такие полезные вещи, как:

-модульная система: JavaScript не предоставляет возможности управлять зависимостями и изоляцией областей видимости;

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

-стандартные интерфейсы к веб-серверам и базам данных;

Для добавления JavaScript-кода на страницу, можно использовать теги <script></script> , которые рекомендуется, но не обязательно, помещать внутри контейнера <head>. Контейнеров <script> в одном документе может быть сколько угодно. Также есть возможность подключения JavaScript, то есть написать скрипт в отдельном файле, а потом подключить его с помощью конструкции:

<script type="text/javascript" src="Путь_к_скрипту"></script>

Именно эта возможность и использована при создании системы.


.4 Физическое моделирование системы


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


.5 Комплекс необходимых программных средств


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

ОС Windows;

-SQLServer: подойдет express версия, которая имеет ограничение на размер базы данных; в использованном выпуске MSSQLServer 2008 Express ограничение 10Гб; благодаря тому, что картинки, прикрепленные к объявлениям, хранятся в файловой системе, база данных вряд ли достигнет

Рисунок 3.1. Физическая модель данных.


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

-MSSQLManagementStudio: этот инструмент нужен для управления базами данных на сервере, создания бэкапов, восстановления данных, и т.д.;

-IIS: именно этот инструмент позволит работать с сайтом;

Дистрибутив с содержимым сайта: содержит все используемые библиотеки для правильной работы сайта, иконки, фоны, картинки объявлений, представления, файлы конфигурации; все это доступно после публикации проекта из VisualStudio.


.6 Функции, используемые в системе агентства недвижимости


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

///<summary>

/// Get запрос формы регистрации

///</summary>

///<returns></returns>Registration()

///<summary>

/// Post запрос формы регистрации

///</summary>

///<param name="model"></param>

///<returns></returns>

[HttpPost]

[AllowAnonymous]

[ValidateAntiForgeryToken]Registration(RegisterModel model)

Обе эти функции нужны для обслуживания формы регистрации пользователя. Первая является get-запросом (выполняется при запросе данных с сервера), а вторая - post-запросом (выполняется при передаче данных на сервер при сабмите формы). При этом, в post-запрос из представления поступают данные, которые содержатся в переменной «model». Далее, в теле метода с этими данными можно совершать необходимые действия. Рассмотрим остальные функции контроллеров.

///<summary>

/// Получает картинку капчи

///</summary>

///<returns></returns>

publicActionResultGetCaptcha()

///<summary>

/// Запрос формы входа в систему

///</summary>

///<param name="returnUrl">раздел, в котором находился пользователь</param>

///<returns></returns>Login(string returnUrl)

///<summary>

/// Обработка входа в систему

///</summary>

///<param name="model">данныемодели</param>

///<param name="returnUrl">раздел, в котором находился пользователь</param>

///<returns></returns>

[HttpPost]

[AllowAnonymous]

[ValidateAntiForgeryToken]

[HandleError]Login(LoginModel model, string returnUrl)

///<summary>

/// Запрос формы управления профилем

///</summary>

///<returns></returns>

[HttpGet]

[Authorize]Manage()

///<summary>

/// Обработка изменения учетных данных

///</summary>

///<param name="model">данныемодели</param>

///<returns></returns>

[HttpPost]

[ValidateAntiForgeryToken]

[HandleError]

[Authorize]Manage(ManageModel model)

///<summary>

/// Перенаправление на указанную страницу

///</summary>

///<param name="returnUrl">раздел, в котором находился пользователь</param>

///<returns></returns>RedirectToLocal(string returnUrl)

///<summary>

///Запросдомашнейстраницы

///</summary>

///<returns></returns> Index()

///<summary>

/// Обработка нажатий на главной странице

///</summary>

///<param name="id">Идентификатор выбранного объявления</param>

///<returns></returns>GetImage(string id)

///<summary>

/// Запрос страницы поиска объявлений

///</summary>

///<returns></returns>Index()

///<summary>

/// Обработка заданных критериев поиска

///</summary>

///<param name="search">Модель данных, содержащая критерии поиска</param>

///<returns></returns>

[HttpPost]Index(Search search)

///<summary>

/// Запрос данных конкретного объявления

///</summary>

///<param name="id">Идентификатор объявления</param>

///<returns></returns>

[HttpGet]ViewInfo(string id)

///<summary>

/// Запрос формы создания или редактирования объявления

///</summary>

///<param name="id">Идентификаторобъявления</param>

///<returns></returns>

[Authorize]CreateOrEdit(string id)

///<summary>

/// Обработка данных после редактирования или создания объявления

///</summary>

///<param name="rent">Данныемодели</param>

///<param name="file">Прикрепленныйфайл</param>

///<returns></returns>

[HttpPost]

[Authorize]CreateOrEdit(Rent rent, HttpPostedFileBase file)

///<summary>

///Удалениеобъявления

///</summary>

///<paramname="id">idобъявления</param>

///<returns></returns>

[Authorize]Delete(string id)

///<summary>

/// Получить маленькое изображение

///</summary>

///<param name="id">id объявления</param>

///<param name="name">имяфайла</param>

///<returns></returns>GetSmallImage(string id, string name)

///<summary>

/// Получить большое изображение

///</summary>

///<param name="id">id объявления</param>

///<param name="name">имяфайла</param>

///<returns></returns>GetBigImage(string id, string name)

Как можно заметить, у некоторых методов контроллера есть дополнительные атрибуты: [HttpPost], [ValidateAntiForgeryToken], [HandleError], [Authorize], [AllowAnonymous]. Это не все возможные атрибуты, потому как использовать все возможные нет необходимости. Атрибут [HttpPost] означает, что метод является post-запросом; отсутствие же этого атрибута означает то, что запрос имеет тип get. Атрибут [ValidateAntiForgeryToken] используется в методах, где происходит работа с паролем. Атрибут [HandleError] говорит о том, что в методе нужно отлавливать исключения. Отсутствие данного атрибута не позволит использовать блок try{…} catch{…} таким образом, к какому привыкли программисты десктопных приложений, участок кода в блоке catch не будет выполнен без этого атрибута, это особенность ASP.NETMVC4. Атрибут [Authorize] не позволяет получить доступ к методу пользователю, который не прошел аутентификацию в системе, тогда как атрибут [AllowAnonymous] действует прямо противоположным образом.

Теперь расмотрим функции, которые содержат классы GetData и SetData. Методы этих классов статические, благодаря чему они могут быть использованы без создания экземпляром этих классов.

///<summary>

/// Ищет объявления

///</summary>

///<param name="search">Параметры для поиска</param>

///<param name="userName">Логин пользователя, который осуществляет поиск</param>

///<returns></returns>SearchRent(Search search, string userName)

///<summary>

/// Ищет объявление аренды по id

///</summary>

///<param name="parId">Id объявления</param>

///<param name="userName">Логин пользователя, который осуществляет поиск</param>

///<returns></returns>GetRentData(Guid parId, string userName)

///<summary>

/// Получение списка типов недвижимости

///</summary>

///<returns></returns><SelectListItem> GetAllAppartmentTypes()

///<summary>

/// Получение списка районов недвижимости

///</summary>

///<returns></returns><SelectListItem> GetAllAppartmentZones()

///<summary>

/// Получение списка цен для недвижимости

///</summary>

///<returns></returns><SelectListItem> GetAllAppartmentPrices()

///<summary>

/// Получение списка городов

///</summary>

///<returns></returns><SelectListItem> GetAllAppartmentCities()

///<summary>

/// Проверка пароля пользователя

///</summary>

///<param name="user">Логин пользователя</param>

///<paramname="pass">Парольпользователя</param>

///<returns></returns>CheckPass(string user, string pass)

///<summary>

/// Получение массива типов недвижимости

///</summary>

///<returns></returns>[] GetAppTypes()

///<summary>

///Получениемассиварайонов

///</summary>

///<returns></returns>[] GetAppZones()

///<summary>

///Получениемассивагородов

///</summary>

///<returns></returns>[] GetAppCities()

///<summary>

///Получениемассиваулиц

///</summary>

///<param name="city">Город</param>

///<returns></returns>[] GetAppStreets(string city)

///<summary>

/// Возвращает идентификатор типа квартиры, если такого нет, то создает его

///</summary>

///<param name="name">названиетипанедвижимости</param>

///<returns></returns>GetAppTypeID(string name)

///<summary>

/// Возвращает идентификатор района квартиры, если такого нет, то создает его

///</summary>

///<param name="name">названиерайона</param>

///<returns></returns>GetAppZoneID(string name)

///<summary>

/// Проверяет, является ли пользователь сотрудником

///</summary>

///<param name="id">идентификаторпользователя</param>

///<returns></returns>UserIsEmployee(Guid id)

///<summary>

/// Проверяет, является ли пользователь администратором

///</summary>

///<param name="id">идентификаторпользователя</param>

///<returns></returns>UserIsAdmin(Guid id)

///<summary>

/// Проверяет, разрешен ли пользователь для данного объявления

///</summary>

///<param name="userName">Логинпользователя</param>

///<param name="idApp">Идентификатор объявления</param>

///<returns></returns>AllowedUser(string userName, string idApp)

///<summary>

/// Получает список с именами файлов для данного объявления

///</summary>

///<param name="id">Идентификаторобъявления</param>

///<returns></returns>[] GetPhotos(Guid id)

///<summary>

/// Получает путь к файлу по id объявления и имени файла

///</summary>

///<param name="id"></param>

///<param name="name"></param>

///<returns></returns>GetFullNameImg(string id, string name)

///<summary>

/// Получаем путь к папке с файлами по id объявления

///</summary>

///<param name="id"></param>

///<returns></returns>GetFullNameImg(string id)

///<summary>

/// Проверяет, есть ли номер объявления в базе

///</summary>

///<param name="number"></param>

///<returns></returns>CheckAppNumber(string number)

///<summary>

/// Получает ид пользователя по логину

///</summary>

///<param name="login"></param>

///<returns></returns>GetUserId(string login)

///<summary>

/// Получает данные пользователя по логину

///</summary>

///<param name="login"></param>

///<returns></returns>GetUser(string login)

///<summary>

/// Получает данные для домашней страницы

///</summary>

///<returns></returns>GetHomeData()

///<summary>

/// Создает учетную запись пользователя

///</summary>

///<param name="user">Модель данных пользователя</param>

publicstaticvoid CreateAndUpdateUser(User user)

///<summary>

/// Создает новое объявление

///</summary>

///<paramname="appartment">Данныемодели</param>

///<param name="registeredBy">Логин пользователя, который создает объявление</param>

///<returns>Гуид созданного объявления</returns>

publicstaticGuid CreateAppartment(Appartments appartment, string registeredBy = "")

///<summary>

/// Создает новый адрес

///</summary>

///<paramname="address">Данныемодели</param>

///<returns>Гуид созданного адреса</returns>CreateAddress(Addresses address)

///<summary>

/// Создает новый тип недвижимости

///</summary>

///<param name="name">Названиетипа</param>

///<returns></returns>CreateAppType(string name)

///<summary>

/// Создает новый район

///</summary>

///<paramname="name">Названиерайона</param>

///<returns></returns>CreateAppZone(string name)

///<summary>

///Обновляетобъявление

///</summary>

///<param name="appartment">Данныемодели</param>

///<returns></returns>UpdateAppartment(Appartments appartment)

///<summary>

///Обновляетадрес

///</summary>

///<param name="address">Данныемодели</param>

///<returns></returns>UpdateAddress(Addresses address)

///<summary>

///Удаляетобъявление

///</summary>

///<param name="id">Идентификаторобъявления</param>

///<returns></returns>DeleteAppartment(Guid id)

///<summary>

/// Обновляет данные пользователя

///</summary>

///<paramname="login">Логинпользователя</param>

///<param name="model">Данныемодели</param>

///<returns></returns>UpdateUser(string login, ManageModel model)

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


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


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

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


Рис 3.2. Внешний вид главной страницы.

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


Рис 3.3. Страница входа в систему.


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

Рис 3.4. Форма для регистрации пользователя.


Рис 3.5. Форма регистрации с показанными ошибками при вводе.


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

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

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

Рис 3.6. Осуществленный вход в систему


Рис 3.7. Форма управления учетными данными


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

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


Рис 3.8. Вывод поиска объявлений без входа в систему

Для размещения объявления нужно на верхней панели нажать кнопку «Сдать квартиру», и затем заполнить форму, показанную на рисунке 3.9.


Рис 3.9. Форма создания нового объявления


На этой форме, опять же, присутствуют обязательные поля, названия которых подчеркнуты. Поля «Тип аренды», «Район», «Город», «Улица» имеют автокомплит (автозаполнение). Это значит, что если начать вводить в эти поля текст, в выпадающем меню появятся варианты, начинающиеся на символы введенного текста. Кроме того, это выпадающее меню появится даже при обычном клике на поле ввода, в котором появятся все содержащиеся в базе данных варианты. Работа автокомплита показана на рисунках 3.10 и 3.11.


Рис 3.10. Все содержащиеся в базе данных варианты ввода в поле «Тип аренды»


Рис 3.11. Поле ввода «Тип аренды» после начала ввода текста.


Подобным образом работают и остальные перечисленные поля, причем в поле «Улица» доступны улицы только из выбранного города.

К объявлению можно прикрепить изображение (пока только формата jpg). Для этого нужно нажать на кнопку «Выбрать файл», после чего появится диалоговое окно, в котором можно будет выбрать файл из файловой системы пользователя. После выбора файла нужно нажать на кнопку «Отправить». При этом, если не заполнены обязательные поля, на странице будет показан список ошибок. Эти ошибки никак не влияют на прикрепление изображения к объявлению. Это происходит из-за особенностей шаблона MVC, так как передать данные в контроллер можно только через отправку всей формы в контроллер, который обрабатывает и загрузку файла, и валидацию данных. Данный эффект показан на рисунке 3.12.


Рис 3.12. Валидация при загрузке изображения.

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

После успешного размещения пользователем одного или нескольких объявлений, в таблице поиска они будут доступны для редактирования именно для этого пользователя (рисунок 3.13), а размещенные другими пользователями - доступны лишь для просмотра.


Рис 3.13. Страница поиска объявления


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

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

При нажатии на кнопку «Просмотр» (лупа в колонке действий) будет открыта более подробная информация об объявлении (рисунок 3.14).


Рис 3.14. Общая информация об объявлении


Если открытое объявление создано пользователем, который в настоящее время осуществил вход в систему, то справа вверху будет доступна кнопка «Редактировать», нажав на которую возможно отредактировать данные этого объявления.

На рисунке 3.14 показано объявление, открытое обычным пользователем. Как видно, здесь нет адреса и телефона. Если же объявление открывает сотрудник агентства, то его форма выглядит немного иначе (рисунок 3.15).

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

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

Если пользователь является администратором сайта, то ему предоставлены самые широкие полномочия: он может редактировать любое размещенное объявление. Эту возможность можно наблюдать на странице поиска (рисунок 3.17).

Рис 3.15. Форма просмотра информации работником агентства


Рис 3.16. Галерея фотографий на jQuery


Рис 3.17. Таблица поиска глазами администратора


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

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


4. ОРГАНИЗАЦИОННО-ЭКОНОМИЧЕСКАЯ ЧАСТЬ


.1 Технико-экономическое обоснование необходимости разработки информационно - аналитической системы агентства недвижимости «Центр жилья»


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

В данном дипломном проекте было создано приложение, на основе которого будет функционировать агентство недвижимости. Это позволит сэкономить некоторые материальные средства, которые нужно было бы заплатить стороннему разработчику.

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

Благодаря автоматизации работы агентства, могут быть выделены следующие преимущества:

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

5)Перенос части работы агентства по поиску подходящих вариантов на пользователя: он сам ищет подходящее объявление, а агенту сообщает лишь номер этого объявления.

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

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

-завышенная цена продукта;

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

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

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

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

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

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

-клиентская часть приложения для предоставления пользователям эффективного интерфейса.

Разрабатываемый программный интерфейс работника агентства предоставляет возможность:

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

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

Программный интерфейс обычного пользователя предоставляет возможности:

- искать походящее объявление;

оставлять заявку на осмотр квартиры с агентом.

Программный интерфейс зарегистрированного пользователя предоставляет возможности:

просматривать те же данные, что и обычный пользователь;

размещать объявление на сайте.

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

Программа должна находиться на хостинге, поддерживающем приложения с архитектурой MVC4, а также СУБД MSSQL.


.2 Планирование разработки


.2.1 Календарное планирование

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

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


(4.1)

где - минимальная продолжительность отдельной работы, чел.-дн.;

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

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

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

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


Таблица 4.1

Трудоемкость проектных работ

№ п/пНаименование работы Оценка трудоемкости, чел.-дн.tmintmaxtож123451Постановка задачи дипломного проектирования354 2Анализ предметной области61083Знакомство с технической документацией и требованиями на разработку3544Анализ существующих программных продуктов2435Разработка функциональной структуры4766Анализ и выбор средств разработки программного продукта2337Проектирование базы данных913118Изучение языка С#1620189Изучение архитектуры MVC59710Разработка алгоритма информационно-аналитической системы агентства недвижимости698 11Написание программных модулей43504612Отладка программных модулей17221913Тестирование программы10171314Организация контроля и защиты информации11151315Составление документации17211916Корректировка теоретических положений разработки8141117Общая трудоемкость162224193

Рисунок 4.1 - Календарный план работ по проектированию системы


.2.2 Организационный, юридический и финансовый аспекты разработки

Данный проект разрабатывался программистом с некоторым опытом работы в предметной области. Данная тема выполняется одним разработчиком, основная квалификация которого - программист. Для разработки требуются знания языков С#, а также принципов работы СУБД MS SQL SERVER.

Заказчиком разработки является агентство недвижимости Краснодарского края «Центр Жилья». Все необходимые данные для разработки были переданы директором агентства недвижимости. Разработка финансировалась из средств бюджета. Права на разработку принадлежат разработчику ПО.

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

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

Расчёты стоимости проекта приведены в разделе 4.4, расчеты цены изделия приведены в разделе 4.5.


.3 Стоимостная оценка проекта

база данных моделирование

Все цены и расценки взяты на апрель 2013 г. Стоимостная оценка проекта производится по формуле [5]:


(4.2)


где - оценка труда разработчика темы, руб.;

- затраты на отладку программного обеспечения, руб.;

- затраты на доукомплектование ЭВМ техническими средствами, если они приобретались специально для выполнения этого проекта ( = 0 руб.);

- прочие затраты, руб.

Оценка труда разработчика задачи может быть определена из должностного оклада инженера-программиста ( = 10500 руб./мес.) и периода проектирования , взятого по фактическим данным из таблицы 4.1 ( = 193 дн.) по формуле [5]:



где - должностной оклад разработчика в день, О = 495, 28 руб./дн. (в среднем количество рабочих дней в месяце - 21,2);

- фактический период проектирования в днях, взятый из таблицы 4.1 (193 дн.);

- процент дополнительной заработной платы (10 %);

- процент отчисления в пенсионный фонд РФ (22%);

- отчисления в фонд социального страхования (2,9%);

- отчисления в федеральный фонд обязательного медицинского страхования (5,1%);

- процент накладных расходов (12 %).

Тогда по формуле [5]:

руб.

Стоимостная оценка использования ЭВМ при проектировании проводится по формуле:


, (4.3)

где - время отладки на ЭВМ, ч.;

- стоимость машино-часа работы ЭВМ, руб.

Время отладки на ЭВМ, взято из графика рисунка 4.1:

ч.

Стоимость машино-часа работы ЭВМ можно определить, исходя из эксплуатационных расходов, связанных с использованием вычислительной техники [5]:


(4.4)


где - суммарные затраты за год работы ЭВМ, которая использовалась при разработке проекта, руб.;

- действительный фонд времени работы ЭВМ за год, ч.

Суммарные эксплуатационные затраты за год работы ЭВМ можно определить по формуле [5]:


(4.5)


где - затраты на оплату труда персонала, обслуживающего ЭВМ, руб./год;

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

- затраты на электроэнергию, руб./год;

- амортизационные отчисления от стоимости ЭВМ, руб./год;

- затраты на материалы (носители информации), руб./год;

- затраты на ремонт, руб./год.

Затраты на оплату труда персонала, обслуживающего ЭВМ, определяются по формуле [5]:



где - доля месячного оклада работника за обслуживание одной ЭВМ, руб.

Проект выполнялся на ЭВМ, на обслуживание которой выделяется 400 руб./мес., т.о. = 400 руб./мес., тогда:


руб.


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

Для определения действительного фонда времени за год определим номинальный фонд по формуле [5]:



где - количество дней в году (365);

- количество выходных дней в году (104);

- количество праздничных дней в году, не совпадающих с выходными (12).

Тогда [5]:

дн/год.

Номинальный фонд времени, выраженный в часах с учетом сокращения на один час четырех праздничных дней [5]:

ТН = 249 · 4 = 996 ч/год.

Исходя из номинального фонда времени за год, определим действительный фонд времени за год по формуле [5]:



где - процент потерь рабочего времени, связанных с профилактикой и ремонтом ЭВМ (5 %);

- номинальный фонд времени (ч./год).

В результате получаем:

ч./год.

Расчёт затрат, связанных с потреблением силовой электроэнергии, выполняется по формуле [5]:



где - паспортная мощность ЭВМ (= 0,35 кВт);

- действительный годовой фонд времени работы ЭВМ, ч.

- тариф одного кВт-ч энергии для населения на момент выполнения расчёта (= 3,23 руб./ кВт-ч);

- коэффициент интенсивного использования мощности ( =

= 0,9).

Получим:

руб./год.

Амортизационные отчисления, затраты на материалы и ремонт вычисляются, исходя из балансной стоимости ЭВМ [5]:



где - цена приобретения ЭВМ, руб.;

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

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

руб.

Амортизационные отчисления от балансовой стоимости ЭВМ:



где - амортизационные отчисления на реновацию ( = 33%).

В результате получаем:

руб./год.

Затраты на материалы и носители информации [5]:



где - норматив затрат на материалы и носители информации

( = 2 %).

руб./год.

Затраты на ремонт определяются по формуле [1]:



где - норматив затрат на ремонт ( = 2,2 %).

руб./год.

По формуле (4.5) находим величину эксплуатационных затрат:

руб./год.

Результаты расчёта эксплуатационных расходов приведены в таблице 4.2.

Исходя из эксплуатационных расходов по работе ЭВМ, по формуле (4.4) находим стоимость машинного часа:

руб./ч.

По формуле (4.3) находим стоимостную оценку использования ЭВМ при проектировании, исходя из суммарного фактического периода 596 часов, взятого из таблицы 4.1:

руб./ч.

Также в процессе разработки были потрачены средства на услуги и материалы (таблица 4.3).

Тогда стоимостная оценка проекта по формуле (4.2) составит:

руб.

Таблица 4.2

Смета эксплуатационных расходов по работе ЭВМ

Наименование статей затратСумма, руб./годЗатраты на оплату труда обслуживающего персонала7440,0Затраты на содержание помещения0Затраты на электроэнергию962,71Амортизационные отчисления8497,5Затраты на носители информации515,0Затраты на ремонт566,5Итого эксплуатационных расходов17981,71

Таблица 4.3

Прочие затраты

Наименование статей затратСумма, руб.1 пачка бумаги (500 листов)120Услуги интернета500Картридж цветной для струйного принтера750Картридж черный для струйного принтера700Лазерные диски80Канцелярские товары130Итого:2280

Данные для расчета себестоимости проектирования приведены в таблице 4.4.


Таблица 4.4

Себестоимость проектирования

Наименование статей затратСумма, руб.Расходы по оплате труда разработчика, в том числе:148163,01Затраты на отладку программного обеспечения11324,0Прочие затраты2280,0Итого себестоимость проекта161767,01

4.4 Формирование цены разработки


Цену изделия определяли по следующей формуле [5]:


(4.7)


где - стоимостная оценка проекта (руб.);

- прибыль (руб.).

Прибыль рассчитывается с использованием норматива рентабельности по формуле [5]:



где - норматив рентабельности ( = 30 %).

Получаем:

руб.

Тогда, в соответствии с формулой (4.7), получаем:

руб.

Цена объекта проектирования (ЦПР) с учётом НДС определялась как:


руб,


где = 18 % - ставка налога на добавленную стоимость.

4.5 Анализ экономической целесообразности внедрения объекта проектирования


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

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

Совокупные затраты, связанные с владением технологией (), определяются следующим образом [5]:



где - себестоимость проекта, руб., которая делится на срок морального старения для определения годовой доли, в данном случае =

= 3 года;

- затраты на эксплуатацию системы, руб./год.

Затраты на эксплуатацию определяются при условии ежедневного использования разработки в течение 8 часов с использованием данных о часовой заработной плате работника, занятого эксплуатацией (часовая заработная плата работника - 61,91 руб./час) и стоимость машино-часа работы ЭВМ при эксплуатации [5]:


где - количество рабочих дней в году;

- время ежедневной эксплуатации системы, ч.;

- оплата пользователя системы за 1 час работ, руб.;

- стоимость одного машинного часа работы ЭВМ пользователя, руб.

Стоимость машино-часа работы ЭВМ пользователя можно определить, исходя из эксплуатационных расходов, связанных с использованием вычислительной техники [5]:


(4.4)


где - суммарные затраты за год работы ЭВМ, которая использовалась при разработке проекта, руб.;

- действительный фонд времени работы ЭВМ за год, ч.

Суммарные эксплуатационные затраты за год работы ЭВМ можно определить по формуле [5]:


(4.5)


где - затраты на оплату труда персонала, обслуживающего ЭВМ, руб./год;

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

- затраты на электроэнергию, руб./год;

- амортизационные отчисления от стоимости ЭВМ, руб./год;

- затраты на материалы (носители информации), руб./год;

- затраты на ремонт, руб./год.

Затраты на оплату труда персонала, обслуживающего ЭВМ, определяются по формуле [5]:



где - доля месячного оклада работника за обслуживание одной ЭВМ, руб.

Программный продукт будет эксплуатироваться на ЭВМ, на обслуживание которой выделяется 400 руб./мес., т.о. = 400 руб./мес., тогда:

руб.

Затраты на аренду помещения отсутствуют (). Так как помещение, где расположено агентство недвижимости, находится в собственности владельца агентства.

Для определения действительного фонда времени за год определим номинальный фонд по формуле [5]:



где - количество дней в году (365);

- количество выходных дней в году (104);

- количество праздничных дней в году, не совпадающих с выходными (12).

Тогда [5]:

дн/год.

Номинальный фонд времени, выраженный в часах с учетом сокращения на один час четырех праздничных дней [5]:

ТН = 245 · 8 + 4 · 7 = 1988 ч/год.

Исходя из номинального фонда времени за год, определим действительный фонд времени за год по формуле [5]:



где - процент потерь рабочего времени, связанных с профилактикой и ремонтом ЭВМ (5 %);

- номинальный фонд времени (ч./год).

В результате получаем:

ч./год.

Расчёт затрат, связанных с потреблением силовой электроэнергии, выполняется по формуле [5]:



где - паспортная мощность ЭВМ (= 0,35 кВт);

- действительный годовой фонд времени работы ЭВМ, ч.

- тариф одного кВт-ч энергии на момент выполнения расчёта (= 3,8 руб./ кВт-ч);

- коэффициент интенсивного использования мощности ( =

= 0,9).

Получим:

руб./год.

Амортизационные отчисления, затраты на материалы и ремонт вычисляются, исходя из балансной стоимости ЭВМ [5]:



где - цена приобретения ЭВМ, руб.;

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

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

руб.

Амортизационные отчисления от балансовой стоимости ЭВМ:



где - амортизационные отчисления на реновацию ( = 33%).

В результате получаем:

руб./год.

Затраты на материалы и носители информации [5]:



где - норматив затрат на материалы и носители информации

( = 2 %).

руб./год.

Затраты на ремонт определяются по формуле [5]:



где - норматив затрат на ремонт ( = 2,2 %).

руб./год.

По формуле (4.5) находим величину эксплуатационных затрат:

руб./год.

Исходя из эксплуатационных расходов, находим стоимость одного машинного часа работы ЭВМ пользователя:

руб./ч.

Получаем:

руб./год.

руб./год

Коэффициент отдачи с инвестированных средств () определяется по формуле:


.


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


5. БЕЗОПАСНОСТЬ ЖИЗНЕДЕЯТЕЛЬНОСТИ


.1 Расчет искусственного освещения на рабочем месте оператора системы с учетом требований санитарных норм


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

Исходные данные для расчета искусственного освещения: помещение, в котором находится рабочее место оператора ПЭВМ имеет длину 5,5 м, ширину 3,5 м и высоту потолка 2,8 м; освещаемая поверхность находится на высоте 0,77 м от пола.

Для искусственного освещения помещения используются следующие источники света: лампы накаливания; газоразрядные лампы низкого давления (люминесцентные); газоразрядные лампы высокого давления (дуговые ртутные люминесцентные - ДРЛ); дуговые ксеноновые лампы; металлогалоидные (лампы высокого давления с иодидами ДРИ).

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

Для освещения рабочего места оператора ПЭВМ рекомендуется применять люминесцентные лампы. Лампы этого типа характеризуются более высоким КПД (в 1.5-2 раза выше, чем КПД ламп накаливания); повышенной светоотдачей (в 3-4 раза выше, чем у ламп накаливания); более длительным сроком службы (до 10000 ч), близким к естественному спектральному составу излучаемого света.

Для освещения рабочего места оператора используются светильники типа УСП-35. Для светильников будут использоваться лампы типа ЛБ-40, мощностью 40 Вт и световым потоком одной лампы 2480 лм [17]. К достоинствам ламп ЛБ-40 можно отнести их экономичность, их световая отдача на 60% и 30% выше, чем у ламп ЛДЦ и ЛД соответственно, к недостаткам можно отнести то, что по цветности, они не так близки к дневному свету как лампы ЛТБ и занимают промежуточное положение между дневным светом и лампами накаливания.

Коэффициенты отражения светового потока имеют значения: для потолка, окрашенного белой краской 70%; для стен, окрашенных светло-зеленой фасадной краской 50%; для пола, окрашенного темно-коричневой краской 10% [7].

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

Расчет освещенности помещения для люминесцентных ламп производится по формуле [17]:


Е = (Fл · N · ? · n) / (S · Кз · Z), (1)


где Е - минимальная нормируемая освещенность, лк;

Fл - световой поток одной лампы, лм;

S - площадь пола помещения, м2;

Кз - коэффициент запаса;

Z - поправочный коэффициент;

N - число светильников в помещении, шт;

? - коэффициент использования осветительной установки;

n - число ламп в светильнике, шт.

Световой поток одной лампы ЛБ-40 составляет 2480 лм. [17]

Площадь пола помещения S оператора ПЭВМ, вычисляемая по формуле [17]:


S= АВ,


где А - ширина помещения, м;

В - длина помещения, м.

S = 3,5 · 5,5 = 19,2 м2.

Коэффициент запаса Кз принимается для помещений с нормальной средой и светильниками с люминесцентными лампами, Кз = 1,5 [9];

Поправочный коэффициент Z вводят для получения минимальной освещенности, принимаемый для светильников с люминесцентными лампами за 1,2.

Для определения коэффициента использования ? необходимо вычислить показатель помещения ?, учитывающий влияние соотношения размеров конфигурации помещения и высоты подвеса светильника над рабочей поверхностью по формуле [17]:


? = (А · В) / (Нр · (А + В)),


где Нр - высота подвеса светильника над рабочей поверхностью, м.

Высота подвеса светильников над рабочей поверхностью определяется по формуле [17]:

Нр = H - hn ,


где H - высота помещения, м;

hn - высота освещаемой поверхности над полом, м.

Нр = 2,8 - 0,77 = 2,03 м.

? = (3,5 · 5,5) / (2,03 · (3,5 + 5,5)) = 1,05

Зная коэффициенты отражения потолка, стен и пола, а также показатель помещения, по нормативным таблицам находим коэффициент использования светового потока светильника: ? = 0,47. [17]

Число светильников типа УСП-35 общего освещения N по плану помещения (с условным размещением светильников) составляет 4 шт.

Тогда по формуле (1):

Е = (2480 · 4 · 0,47 · 4) / (19,2 · 1,5 · 1,2) = 539,63 лк.

Работа оператора ПЭВМ относится к категории работ высокой точности (наименьший размер объекта различения - от 0,3 до 0,5 мм), что соответствует III разряду зрительных работ. [13]

Значение минимальной нормируемой освещенности Е для III разряда зрительных работ составляет 300 лк. [13]

При выбранных типах светильника и лампы освещенность рабочего места оператора ПЭВМ составила 539,63 лк, что соответствует норме. Таким образом, типы ламп и светильников, а также их количество в помещении бы ли выбраны верно.


.2 Проектирование рабочего места оператора системы с учетом тре бований санитарных норм


Рабочее место - место, где работник должен находиться и где он выполняет работу в режиме и условиях, предусмотренных нормативно-технической документацией [3].

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

Согласно ГОСТ 12.2.032-78 конструкция рабочего места и взаимное расположение всех его элементов должно соответствовать антропометрическим, физическим и психологическим требованиям. Большое значение имеет также характер работы. В частности, при организации рабочего места программиста должны быть соблюдены следующие основные условия:

¾оптимальное размещение оборудования, входящего в состав рабочего места;

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

¾необходимо естественное и искусственное освещение для выполнения поставленных задач;

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

Спроектируем рабочее место оператора системы агентства недвижимости. Оператор системы агентства недвижимости в основном находится в положении сидя, подвижность во время работы - ограничена, радиус рабочей зоны 38 - 50 см. Это работа, производимая сидя и не требующая физического напряжения, при которой расход энергии составляет не более 628 кДж/ч.

Конструкция рабочего стола обеспечивает оптимальное размещение на рабочей поверхности используемого оборудования с учетом его количества, конструктивных особенностей и характера выполняемой работы. Экран монитора находится от глаз пользователя на оптимальном расстоянии 600 - 700 мм. Высота рабочей поверхности стола не регулируется, и поэтому составляет 725 мм.

Конструкция рабочего стула обеспечивает поддержание рациональной рабочей позы при работе с ПЭВМ, позволять изменять позу с целью снижения статического напряжения мышц шейно-плечевой области спины, предотвратить утомление. Рабочий стул (кресло) является подъёмно-поворотным и регулируемым по высоте и углам наклона сиденья и спинки. Ширина и глубина поверхности сиденья рабочего кресла составляет 425 мм. Высота поверхности сиденья регулируется в пределах 400 - 550 мм. Высота опорной поверхности спинки составляет 300 ± 20 мм, ширина - 450 мм. Рабочее кресло имеет съемные подлокотники длиной 380 мм и шириной 65 мм. Внутреннее расстояние между подлокотниками составляет 450 мм.

Примерные размеры элементов оператора системы приведены на рисунке 5.1.


а) Вид сверху


б) Вид сбоку

Рисунок 5.1 - Рабочее место оператора системы агентства недвижимости

1 - монитор; 2 - клавиатура; 3 - мышь; 4 - системный блок; 5 - рабочее кресло.


Рабочее место с ПЭВМ по отношению к световому проему располагается так, что естественный свет падает с левого бока. Оконные проемы оборудованы регулируемыми жалюзи. Расстояние между видеомониторами, в направлении тыла одного видеомонитора и экрана другого составляет 2,5 м.

Расположение рабочих мест операторов показано на рисунке 5.2.

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

Рисунок 5.2 - Расположение рабочих мест операторов

, 2 - окно;

, 4 - рабочий стол;

, 6 - ПЭВМ;

, 8 - рабочее кресло;

- дверь;

10 - стеллаж.


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

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

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

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

Уровень шума в помещении, в котором находится рабочее место оператора системы, не превышает 55 дБ.

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

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

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

Освещение помещения является смешанным. В качестве источников искусственного освещения используются люминесцентные лампы ЛБ-40, которые попарно объединены в светильники УСП-35. Эти светильники расположены над рабочими поверхностями в равномерно - прямоугольном порядке. При этом коэффициент естественного освещения должен быть не ниже 1,5%. Освещенность на поверхности стола в зоне размещения рабочего документа равна 300 - 500 лк.

По сравнению с лампами накаливания, достоинством люминесцентных ламп является: по спектральному составу света они близки к дневному, естественному освещению; обладают более высоким КПД (в 1.5-2 раза выше, чем КПД ламп накаливания); обладают повышенной светоотдачей (в 3-4 раза выше, чем у ламп накаливания); более длительный срок службы.

.3 Использование средств индивидуальной защиты при чрезвычайных ситуациях


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

Гражданская оборона (ГО) - система мероприятий по подготовке к защите и по защите населения, материальных и культурных ценностей на территории Российской федерации от опасностей, возникающих при ведении военных действий или вследствие этих действий [4].

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


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

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

Средства индивидуальной защиты в зависимости от назначения подразделяют на классы: костюмы изолирующие; средства защиты органов дыхания; одежда специальная защитная; средства защиты ног; средства защиты рук; средства защиты головы; средства защиты лица; средства защиты глаз; средства защиты органа слуха; средства защиты от падения высоты и другие предохранительные средства; средства дерматологические защитные; средства защиты комплексные [18].


.3.2 Средства индивидуальной защиты кожи и органов дыхания

По принципу действия СИЗ бывают фильтрующие и изолирующие.

Фильтрующие средства индивидуальной защиты кожи (СИЗК) - это средства из материала, пропитанного специальными составами, обеспечивающими нейтрализацию или сорбцию АХОВ. (Аварийно химически опасное вещество - опасное химическое вещество, применяемое в промышленности и сельском хозяйстве, при аварийном выбросе (разливе) которого может произойти заражение окружающей среды в поражающих живой организм концентрациях [8]). Фильтрующие СИЗ наиболее просты, надежны и не ограничивают работающему свободу движения.

К фильтрующим СИЗК относятся: общевойсковой комплексный защитный костюм - ОКЗК; общевойсковой комплексный защитный костюм модернизированный - ОКЗК-М; защитная фильтрующая одежда - ЗФО-1; костюмы противощелочно - кислотные - КПК; защитный комплект ФЛ-Ф, КЗХИ, ПЗО-2; защитная одежда - АРК-1 (ослабляет ионизирующие излучения) [15].

К фильтрующим средствам индивидуальной защиты органов дыхания (СИЗ ОД) относятся: промышленные противогазы - ПФМ-1, ППФ-95; гражданские противогазы всех модификаций - ГП-5, ГП-7, ПДФ-Ш, ПДФ-Д, ПДФ-7; дополнительный гопкалитовый патрон - ДГП-3, патрон защитный универсальный - ПЗУ к ГП-5,7; камеры защитные детские - КЗД-4, КЗД-6; противопыльная тканевая маска - ПТМ-1; ватно-марлевая повязка; респираторы патронные с резиновой полумаской - РПА-1, РПГ-67, РП-91Ш, «Астра-2»; фильтрующе-поглощающие полумаски - У-2ГП, «Алина-А», «Кама-2000ГП», А-ПАН; фильтрующие полумаски (противоаэрозольные) - «Кама-200», «Лепесток», Р-2, У-2К [18].

В фильтрующих противогазах воздух очищается от вредных веществ за счет фильтрации при прохождении через защитный элемент. Время защитного действия определяется динамической активностью наполнителя коробки. Для ГП-7 это время составляет 7 часов при концентрации веществ в воздухе 0,1 мг/л.

Для защиты от грубодисперсной пыли (размер частиц более 1мкм) применяются респираторы (независимо от обозначения названия и числа) возможно при запыленности превышает ПДК не более чем в 200 раз. Каждый из респираторов имеет определенной назначение и применяется на определенном содержании в воздухе кислорода, на защиту от определенных веществ или группы веществ при определенных концентрациях. Ограничен и срок его работы. Так, респиратор РПГ-67 применяется, когда кислорода в воздухе не менее 16%, РПГ-67 выпускается четырех марок (РПГ-67А; РПГ-67В; РПГ-67КД; РПГ067Г) в зависимости от марки фильтрующих патронов. Марка РПГ-67А рассчитана на пары органических веществ (бензин, керосин, ацетон, спирты, бензол и его гомологи, эфиры и др., пары хлор - и фосфорорганических ядохимикатов). При содержании бензола 10мг/м3 время защитного действия не менее 60мин. Основные данные и назначение респираторов и противогазов приведены в паспорте. При значительном содержании вредных веществ и недостатке кислорода в воздухе ИП-46М; ИП-4; ИП-5.

Использование фильтрующих СИЗ запрещено в следующих случаях:

· объемная доля кислорода в воздухе менее 18%;

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

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

Если же содержание кислорода в воздухе меньше 18% или наличие вредных веществ более 0,5% по объему, в этих случаях нужно применять изолирующие СИЗ.

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

К изолирующим средствам защиты кожи относятся: общевойсковой защитный комплект ОЗК, легкий защитный костюм Л-1; защитный комплекты КИХ-4, КИХ-5; комплект защитный аварийный - КЗА; изолирующий комплект с вентилируемым подкостюмным пространством - Ч20; изолирующий костюм ИЕ-1. Как правило, большинство СИЗ используются как для защиты гражданских лиц, так и личного состава войсковых подразделений.

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

К изолирующим СИЗ ОД относятся изолирующие противогазы - ИП-4, ИП-5, ИП-6, ИП-7. Время защиты в ИП-4 при легкой работе равно трем часам, при тяжелой - 30 минут. В ИП-5 можно вести водолазные работы продолжительностью до 2 часов, на поверхности земли время защитного действия составляет 3,3 часа.

Своевременное и умелое использование СИЗ обеспечивает надежную защиту от отравляющих веществ (ОВ), светового излучения ядерных взрывов (СИЯВ), радиоактивной пыли (РП), радиоактивных веществ (РВ), бактериальных (биологических) аэрозолей (БА), оксида углерода и позволяет выполнять отдельные задачи в среде, лишенной кислорода. СИЗ обеспечивают также кратковременную защиту от открытого пламени.


ЗАКЛЮЧЕНИЕ


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

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

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

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


СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ


1.Атаманюк В.Г. Ширшев Л.Г. Акимов Н.И. Гражданская оборона // Учебник для вузов. Под ред. Михайлика Д.И. - М.: Высш. шк., 1986.

.Белов С. В. Безопасность жизнедеятельности. - М.: Высш. шк., 2008.

.ГОСТ 12.2.032-78 ССБТ. Рабочее место при выполнении работ сидя. Общие эргономические требования. - М., 2001.

4.Гражданская защита. Понятийно-терминологический словарь [Электронный ресурс]. URL: <#"justify">ПРИЛОЖЕНИЕ А. ЛИСТИНГ ПРОГРАММЫ


Файл GetData.cs


using System;System.Collections.Generic;System.IO;System.Linq;System.Web.Mvc;Mvc4Application.Models;MvcEmptyApp.Models;Mvc4Application.Methods {static class GetData {ContextDB _db = new ContextDB();

/// <summary>

/// Ищетобъявления

/// </summary>

/// <param name="search">Параметрыдляпоиска</param>

/// <param name="userName">Логин пользователя, который осуществляет поиск</param>

/// <returns></returns>static Search SearchRent(Search search, string userName) {userId = GetData.GetUserId(userName);userIsAdmin = UserIsAdmin(userId);result = new Search();.Types = GetAllAppartmentTypes().ToArray();.Zones = GetAllAppartmentZones().ToArray();.AllPrice = GetAllAppartmentPrices();.Cities = GetAllAppartmentCities().ToArray();.RentData = new List<Rent>();

//object s = sort;(search == null || search.FirstBoot) {.MinPrice = 3000;.MaxPrice = 10000;.FirstBoot = true;data = from item in _db.Appartmentstype in _db.AppartmentTypesitem.Type equals type.Idzone in _db.AppartmentZonesitem.Zone equals zone.Id(

(1 == 1)

)item.Price ascendingnew {.Id,.TypeName,.ZoneName,.ZoneNameGenitive,.Daily,.WithoutOwners,.RoomCount,.Price,.Description,.RegisteredBy,.Number

};

//data.OrderBy<>(var item in data) {.RentData.Add(new Rent() {= item.Id,= item.TypeName,= item.ZoneNameGenitive,= item.ZoneName,= item.Daily,= item.WithoutOwners,= item.RoomCount,= item.Price,= item.Description,= (userId != Guid.Empty) && (item.RegisteredBy == userId || userIsAdmin),= item.Number

});

}(search != null)(search.Sort) {"Type":.RentData.Sort(delegate(Rent r1, Rent r2)

{ return r1.Type.CompareTo(r2.Type); });;"Zone":.RentData.Sort(delegate(Rent r1, Rent r2)

{ return r1.Zone.CompareTo(r2.Zone); });;"Room":.RentData.Sort(delegate(Rent r1, Rent r2)

{ return r1.RoomCount.CompareTo(r2.RoomCount); });;:.RentData.Sort(delegate(Rent r1, Rent r2)

{ return r1.Price.CompareTo(r2.Price); });;

}

} else {(search.SelectedTypes == null).SelectedTypes = new string[] { "" };(search.SelectedZones == null).SelectedZones = new string[] { "" };data = from item in _db.Appartmentstype in _db.AppartmentTypesitem.Type equals type.Idzone in _db.AppartmentZonesitem.Zone equals zone.Iddrs in _db.Addressesitem.Id equals drs.Id.Number != "" ? item.Number == search.Number :

(search.SelectedTypes.Contains(type.TypeName) &&

(search.SelectedZones.Contains(zone.ZoneName)) &&

(search.WithoutOwners == true ? item.WithoutOwners == search.WithoutOwners : 1 == 1) &&

(search.Daily == true ? item.Daily == search.Daily : 1 == 1) &&

(item.Price >= search.MinPrice) &&

(item.Price <= search.MaxPrice) &&

(drs.City == search.City)

)new {.Id,.TypeName,.ZoneName,.ZoneNameGenitive,.Daily,.WithoutOwners,.RoomCount,.Price,.Description,.RegisteredBy,.Number

};(var item in data) {.RentData.Add(new Rent() {= item.Id,= item.TypeName,= item.ZoneNameGenitive,= item.ZoneName,= item.Daily,= item.WithoutOwners,= item.RoomCount,= item.Price,= item.Description,= (userId != Guid.Empty) && (item.RegisteredBy == userId || userIsAdmin),= item.Number

});

}(search.Sort) {"Type":.RentData.Sort(delegate(Rent r1, Rent r2)

{ return r1.Type.CompareTo(r2.Type); });;"Zone":.RentData.Sort(delegate(Rent r1, Rent r2)

{ return r1.Zone.CompareTo(r2.Zone); });;"Room":.RentData.Sort(delegate(Rent r1, Rent r2)

{ return r1.RoomCount.CompareTo(r2.RoomCount); });;:.RentData.Sort(delegate(Rent r1, Rent r2)

{ return r1.Price.CompareTo(r2.Price); });;

}

}result;

}

/// <summary>

/// Ищетобъявлениеарендыпо id

/// </summary>

/// <param name="parId">Id объявления</param>

/// <param name="userName">Логин пользователя, который осуществляет поиск</param>

/// <returns></returns>static Rent GetRentData(Guid parId, string userName) {userId = GetData.GetUserId(userName);userIsEmployee = UserIsEmployee(userId);userIsAdmin = UserIsAdmin(userId);allowedUser = AllowedUser(userName, parId.ToString());rent = new Rent();rentData = from item in _db.Appartmentstype in _db.AppartmentTypesitem.Type equals type.Idzone in _db.AppartmentZonesitem.Zone equals zone.Idaddress in _db.Addressesitem.Id equals address.Iduser in _db.Usersitem.RegisteredBy equals user.Iditem.Id == parIdnew {.Id,.TypeName,.ZoneName,.ZoneNameGenitive,.Daily,.WithoutOwners,.RoomCount,.Price,.Description,.Region,.District,.City,.Street,.House,.Appartment,.Number,.Phone

};(var item in rentData) {

//rent.AllPrice = GetAllAppartmentPrices().ToArray();.Id = item.Id;.Type = item.TypeName;.ZoneGenitive = item.ZoneNameGenitive ?? item.ZoneName;.Zone = item.ZoneName;.Daily = item.Daily;.WithoutOwners = item.WithoutOwners;.RoomCount = item.RoomCount;.Price = item.Price;.Description = item.Description ?? "";.AddrCity = item.City;.AddrStreet = item.Street;.AddrHouse = item.House;.AddrAppartment = item.Appartment;.Number = item.Number;.Phone = item.Phone;.ExtInfo = userIsEmployee || userIsAdmin;.Editable = allowedUser;

}.Photos = GetPhotos(parId);rent;

}

/// <summary>

/// Получение списка типов недвижимости

/// </summary>

/// <returns></returns>static List<SelectListItem> GetAllAppartmentTypes() {<SelectListItem> list = new List<SelectListItem>();[] arr = GetAppTypes();(var item in arr).Add(new SelectListItem() { Text = item });[0].Selected = true;list;

}

/// <summary>

/// Получение списка районов недвижимости

/// </summary>

/// <returns></returns>static List<SelectListItem> GetAllAppartmentZones() {<SelectListItem> list = new List<SelectListItem>();[] arr = GetAppZones();(var item in arr).Add(new SelectListItem() { Text = item });[0].Selected = true;list;

}

/// <summary>

/// Получение списка цен для недвижимости

/// </summary>

/// <returns></returns>static List<SelectListItem> GetAllAppartmentPrices() {<SelectListItem> list = new List<SelectListItem>();.Clear();(int i = 0; i < 30000; i += 1000) {.Add(new SelectListItem() {= i.ToString()

});

}list;

}

/// <summary>

/// Получение списка городов

/// </summary>

/// <returns></returns>static List<SelectListItem> GetAllAppartmentCities() {<SelectListItem> list = new List<SelectListItem>();[] arr = GetAppCities();(var item in arr).Add(new SelectListItem() { Text = item });[0].Selected = true;list;

}

/// <summary>

/// Проверка пароля пользователя

/// </summary>

/// <param name="user">Логин пользователя</param>

/// <param name="pass">Пароль пользователя</param>

/// <returns></returns>static bool CheckPass(string user, string pass) {data = from item in _db.Usersitem.Login == useritem.Password;(var item in data) {(item.GetHashCode() == pass.GetHashCode())true;;

}false;

}

/// <summary>

/// Получение массива типов недвижимости

/// </summary>

/// <returns></returns>static string[] GetAppTypes() {<string> list = new List<string>();data = from item in _db.AppartmentTypesitem.TypeName;(var item in data) {(item != null).Add(item.ToString());

}.Sort();list.ToArray();

}

/// <summary>

/// Получение массива районов

/// </summary>

/// <returns></returns>static string[] GetAppZones() {<string> list = new List<string>();data = from item in _db.AppartmentZonesitem.ZoneName;(var item in data) {(item != null).Add(item.ToString());

}.Sort();list.ToArray();

}

/// <summary>

/// Получение массива городов

/// </summary>

/// <returns></returns>static string[] GetAppCities() {<string> list = new List<string>();data = from item in _db.Addressesitem.City;(var item in data) {(!list.Contains(item.ToString())).Add(item.ToString());

}.Sort();list.ToArray();

}

/// <summary>

/// Получениемассиваулиц

/// </summary>

/// <param name="city">Город</param>

/// <returns></returns>static string[] GetAppStreets(string city) {<string> list = new List<string>();data = from item in _db.Addressesitem.City == cityitem.Street;(var item in data) {(!list.Contains(item.ToString())).Add(item.ToString());

}.Sort(); list.ToArray();

}

/// <summary>

/// Возвращает идентификатор типа квартиры, если такого нет, то создает его

/// </summary>

/// <param name="name">названиетипанедвижимости</param>

/// <returns></returns>static Guid GetAppTypeID(string name) {id = Guid.Empty;data = from item in _db.AppartmentTypesitem.TypeName == nameitem.Id;<Guid> type = data.ToList();(type.Count() > 0)= type.ElementAt(0);

//foreach (var item in data) {

// id = item;

// break;

//}(id == Guid.Empty) {= SetData.CreateAppType(name);

};

}

/// <summary>

/// Возвращает идентификатор района квартиры, если такого нет, то создает его

/// </summary>

/// <param name="name">названиерайона</param>

/// <returns></returns>static Guid GetAppZoneID(string name) {id = Guid.Empty;data = from item in _db.AppartmentZonesitem.ZoneName == nameitem.Id;<Guid> zone = data.ToList();(zone.Count() > 0)= zone.ElementAt(0);

//foreach (var item in data) {

// id = item;

// break;

//}(id == Guid.Empty) {= SetData.CreateAppZone(name);

};

}

/// <summary>

/// Проверяет, является ли пользователь сотрудником

/// </summary>

/// <param name="id">идентификаторпользователя</param>

/// <returns></returns>static bool UserIsEmployee(Guid id) {(id == null || id == Guid.Empty)false;data = from item in _db.Usersitem.Id == iditem.Role;<string> user = data.ToList();(user.Count() > 0)user.ElementAt(0) == "Employee";

return false;

}

/// <summary>

/// Проверяет, является ли пользователь администратором

/// </summary>

/// <param name="id">идентификаторпользователя</param>

/// <returns></returns>static bool UserIsAdmin(Guid id) {(id == null || id == Guid.Empty)false;data = from item in _db.Usersitem.Id == iditem.Role;<string> user = data.ToList();(user.Count() > 0)user.ElementAt(0) == "Admin";

return false;

}

/// <summary>

/// Проверяет, разрешен ли пользователь для данного объявления

/// </summary>

/// <param name="userName">Логинпользователя</param>

/// <param name="idApp">Идентификатор объявления</param>

/// <returns></returns>static bool AllowedUser(string userName, string idApp) {userId = GetUserId(userName);appId = new Guid(idApp);(userId == Guid.Empty || appId == Guid.Empty)false;(UserIsAdmin(userId))true;data = from item in _db.Appartmentsitem.Id == appIditem.RegisteredBy;<Guid> registeredBy = data.ToList();(registeredBy.Count() > 0)(registeredBy.ElementAt(0) == userId)true;false;

}

/// <summary>

/// Получает список с именами файлов для данного объявления

/// </summary>

/// <param name="id">Идентификаторобъявления</param>

/// <returns></returns>static string[] GetPhotos(Guid id) {[] photos = null;PhotoDir = GetFullNameImg(id.ToString());(Directory.Exists(PhotoDir)) {= Directory.GetFiles(PhotoDir, "*.jpg");(int i = 0; i < photos.Count(); i++) {fi = new FileInfo(photos[i]);[i] = fi.Name;

}

}photos;

}

/// <summary>

/// Получает путь к файлу по id объявления и имени файла

/// </summary>

/// <param name="id"></param>

/// <param name="name"></param>

/// <returns></returns>static string GetFullNameImg(string id, string name) {set = System.Configuration.ConfigurationManager.AppSettings["DirForImages"];fileName = AppDomain.CurrentDomain.BaseDirectory + set + id + "/" + name;(File.Exists(fileName))fileName;

elsenull;

}

/// <summary>

/// Получаем путь к папке с файлами по id объявления

/// </summary>

/// <param name="id"></param>

/// <returns></returns>static string GetFullNameImg(string id) {set = System.Configuration.ConfigurationManager.AppSettings["DirForImages"];dirName = AppDomain.CurrentDomain.BaseDirectory + set + id + "/";

return dirName;

}

/// <summary>

/// Проверяет, есть ли номер объявления в базе

/// </summary>

/// <param name="number"></param>

/// <returns></returns>static bool CheckAppNumber(string number) {data = from item in _db.Appartmentsitem.Number == numberitem.Id;<Guid> apps = data.ToList();(apps.Count() > 0)true;

return false;

}

/// <summary>

/// Получает ид пользователя по логину

/// </summary>

/// <param name="login"></param>

/// <returns></returns>static Guid GetUserId(string login) {id = Guid.Empty;data = from item in _db.Usersitem.Login == loginitem.Id;<Guid> user = data.ToList();(user.Count() > 0)= user.ElementAt(0);

return id;

}

/// <summary>

/// Получает данные пользователя по логину

/// </summary>

/// <param name="login"></param>

/// <returns></returns>static ManageModel GetUser(string login) {model = new ManageModel();.Shared = new SharedPath();

//var dbuser = _db.Users.FirstOrDefault(u => u.Login == login);data = from item in _db.Usersitem.Login == loginnew {.EMail,.Phone,.Comment,.F,.I,.O,.BirthYear

};(var dbuser in data) {

//IEnumerable<var> dbuser = data.ToList();

//if (dbuser != null) {.Shared.Email = dbuser.EMail;.Shared.Phone = dbuser.Phone;.Shared.Comment = dbuser.Comment;.Shared.F = dbuser.F;.Shared.I = dbuser.I;.Shared.O = dbuser.O;.Shared.BirthYear = dbuser.BirthYear;

}model;

}

/// <summary>

/// Получает данные для домашней страницы

/// </summary>

/// <returns></returns>static Home GetHomeData() {

//throw new Exception("Тестовоеисключение");home = new Home();.Data = new List<HomeData>();data = (from item in _db.Appartmentstype in _db.AppartmentTypesitem.Type equals type.Idzone in _db.AppartmentZonesitem.Zone equals zone.Iditem.AddDate descendingnew {.Id,.TypeName,.ZoneName,.ZoneNameGenitive,.Price

}).Take(4);(var item in data) {.Data.Add(new HomeData() {= item.Id,= item.TypeName,= item.ZoneNameGenitive ?? item.ZoneName,= item.Price

});

}home;

}

}

}

Файл SetData.cs

MvcEmptyApp.Models;System.Linq;System;Mvc4Application.Models;Mvc4Application.Methods {class SetData {static ContextDB _db = new ContextDB();static string _adminCode = System.Configuration.ConfigurationManager.AppSettings["AdminCode"];static string _employeeCode = System.Configuration.ConfigurationManager.AppSettings["EmployeeCode"];

/// <summary>

/// Создает учетную запись пользователя

/// </summary>

/// <param name="user">Модель данных пользователя</param>

public static void CreateAndUpdateUser(User user) {dbuser = _db.Users.FirstOrDefault(u => u.Login == user.Login);(dbuser != null) {new Exception("Пользовательужесуществует");

}(user.EMail.IndexOf("@") == -1) {new NotImplementedException("Недопустимаяпочта");

}.Id = Guid.NewGuid();.Role = user.Comment == _adminCode ? "Admin" :.Comment == _employeeCode ? "Employee" : "User";.IsActivated = true;.IsLockedOut = false;.DateOfRegistration = DateTime.Now;.LastLockedOutDate = DateTime.Now;.LastLoginDate = DateTime.Now;

_db.Users.Add(user);

_db.SaveChanges();

}

/// <summary>

/// Создает новое объявление

/// </summary>

/// <param name="appartment">Данныемодели</param>

/// <param name="registeredBy">Логин пользователя, который создает объявление</param>

/// <returns>Гуид созданного объявления</returns>

public static Guid CreateAppartment(Appartments appartment, string registeredBy = "") {userId = GetData.GetUserId(registeredBy);(userId == Guid.Empty)Guid.Empty;{.RegisteredBy = userId;

}(appartment.Id == null || appartment.Id == Guid.Empty).Id = Guid.NewGuid();.RegisteredBy = GetData.GetUserId(registeredBy);.Number = Generate.AppNumber();.AddDate = DateTime.Now;

_db.Appartments.Add(appartment);

_db.SaveChanges();appartment.Id;

}

/// <summary>

/// Создаетновыйадрес

/// </summary>

/// <param name="address">Данныемодели</param>

/// <returns>Гуид созданного адреса</returns>

public static Guid CreateAddress(Addresses address) {(address.Id == null || address.Id == Guid.Empty).Id = Guid.NewGuid();

_db.Addresses.Add(address);

_db.SaveChanges();address.Id;

}

/// <summary>

/// Создает новый тип недвижимости

/// </summary>

/// <param name="name">Названиетипа</param>

/// <returns></returns>static Guid CreateAppType(string name) {appType = new AppartmentTypes();.Id = Guid.NewGuid();.TypeName = name;

_db.AppartmentTypes.Add(appType);

_db.SaveChanges();appType.Id;

}

/// <summary>

/// Создаетновыйрайон

/// </summary>

/// <param name="name">Названиерайона</param>

/// <returns></returns>static Guid CreateAppZone(string name) {appZone = new AppartmentZones();.Id = Guid.NewGuid();.ZoneName = name;

_db.AppartmentZones.Add(appZone);

_db.SaveChanges();appZone.Id;

}

/// <summary>

/// Обновляетобъявление

/// </summary>

/// <param name="appartment">Данныемодели</param>

/// <returns></returns>static bool UpdateAppartment(Appartments appartment) {dbapp = _db.Appartments.FirstOrDefault(u => u.Id == appartment.Id);(dbapp == null)false;.Type = appartment.Type;.Zone = appartment.Zone;.RoomCount = appartment.RoomCount;.Price = appartment.Price;.WithoutOwners = appartment.WithoutOwners;.Daily = appartment.Daily;.Description = appartment.Description;

_db.SaveChanges();true;

}

/// <summary>

/// Обновляетадрес

/// </summary>

/// <param name="address">Данныемодели</param>

/// <returns></returns>static bool UpdateAddress(Addresses address) {dbapp = _db.Addresses.FirstOrDefault(u => u.Id == address.Id);(dbapp == null)false;.Region = address.Region;.District = address.District;.City = address.City;.Street = address.Street;.House = address.House;.Appartment = address.Appartment;

_db.SaveChanges();true;

}

/// <summary>

/// Удаляет объявление

/// </summary>

/// <paramname="id">Идентификаторобъявления</param>

/// <returns></returns>static bool DeleteAppartment(Guid id) {dbapp = _db.Appartments.FirstOrDefault(u => u.Id == id);(dbapp != null)

_db.Appartments.Remove(dbapp);dbaddr = _db.Addresses.FirstOrDefault(u => u.Id == id);(dbaddr != null)

_db.Addresses.Remove(dbaddr);

_db.SaveChanges();true;

}

/// <summary>

/// Обновляет данные пользователя

/// </summary>

/// <param name="login">Логин пользователя</param>

/// <param name="model">Данныемодели</param>

/// <returns></returns>static bool UpdateUser(string login, ManageModel model) {{dbuser = _db.Users.FirstOrDefault(u => u.Login == login);.Phone = model.Shared.Phone;.EMail = model.Shared.Email;.Comment = model.Shared.Comment;.Role = model.Shared.Comment == _adminCode ? "Admin" :.Shared.Comment == _employeeCode ? "Employee" : "User";.F = model.Shared.F;.I = model.Shared.I;.O = model.Shared.O;.BirthYear = model.Shared.BirthYear;

_db.SaveChanges();true;

} catch {false;

}

}

}

}


Файл Captcha.cs

System;System.Collections.Generic;System.Linq;System.Web;System.Drawing;System.Drawing.Drawing2D;System.Drawing.Imaging;Mvc4Application.Methods {

/// <summary>

/// Генерациякапчи

/// </summary>class Captcha {const string CaptchaValueKey = "CaptchaImageText";string Text {{ return text; }

}Bitmap Image {{ return image; }

}int Width {{ return width; }

}int Height {{ return height; }

}

// Internal properties.string text;int width;int height;string familyName;Bitmap image;

// For generating random numbers.Random random = new Random();Captcha(string s, int width, int height) {= s;(width, height);();

}Captcha(string s, int width, int height, string familyName) {= s;(width, height);(familyName);();

}

// ===========================================================

// This member overrides Object.Finalize.

// ===========================================================

~Captcha() {(false);

}

// ===========================================================

// Releases all resources used by this object.

// ===========================================================void Dispose() {.SuppressFinalize(this);(true);

}

// ===========================================================

// Custom Dispose method to clean up unmanaged resources.

// ===========================================================virtual void Dispose(bool disposing) {(disposing)

// Dispose of the bitmap..Dispose();

}

// ===========================================================

// Sets the image aWidth and aHeight.

// ===========================================================void SetDimensions(int aWidth, int aHeight) {

// Check the aWidth and aHeight.(aWidth <= 0)new ArgumentOutOfRangeException("aWidth", aWidth, "Argument out of range, must be greater than zero.");(aHeight <= 0)new ArgumentOutOfRangeException("aHeight", aHeight, "Argument out of range, must be greater than zero.");= aWidth;= aHeight;

}

// ===========================================================

// Sets the font used for the image text.

// ===========================================================private void SetFamilyName(string aFamilyName) {

// If the named font is not installed, default to a system font.{font = new Font(aFamilyName, 12F);= aFamilyName;.Dispose();

} catch (Exception) {= FontFamily.GenericSerif.Name;

}

}

// ===========================================================

// Creates the bitmap image.

// ===========================================================void GenerateImage() {

// Create a new 32-bit bitmap image.bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);

// Create a graphics object for drawing.g = Graphics.FromImage(bitmap);.SmoothingMode = SmoothingMode.AntiAlias;rect = new Rectangle(0, 0, width, height);

// Fill in the background.hatchBrush = new HatchBrush(HatchStyle.SmallConfetti, Color.LightGray, Color.White);.FillRectangle(hatchBrush, rect);

// Set up the text font.size;fontSize = rect.Height + 1;font;

// Adjust the font size until the text fits within the image.{-;= new Font(familyName, fontSize, FontStyle.Bold);= g.MeasureString(text, font);

} while (size.Width > rect.Width);

// Set up the text format.format = new StringFormat();.Alignment = StringAlignment.Center;.LineAlignment = StringAlignment.Center;

// Create a path using the text and warp it randomly.path = new GraphicsPath();.AddString(text, font.FontFamily, (int)font.Style, font.Size, rect, format);v = 4F;[] points =

{PointF(random.Next(rect.Width) / v, random.Next(rect.Height) / v),PointF(rect.Width - random.Next(rect.Width) / v, random.Next(rect.Height) / v),PointF(random.Next(rect.Width) / v, rect.Height - random.Next(rect.Height) / v),PointF(rect.Width - random.Next(rect.Width) / v, rect.Height - random.Next(rect.Height) / v)

};matrix = new Matrix();.Translate(0F, 0F);.Warp(points, rect, matrix, WarpMode.Perspective, 0F);

// Draw the text.= new HatchBrush(HatchStyle.LargeConfetti, Color.LightGray, Color.DarkGray);.FillPath(hatchBrush, path);

// Add some random noise.m = Math.Max(rect.Width, rect.Height);(int i = 0; i < (int)(rect.Width * rect.Height / 30F); i++) {x = random.Next(rect.Width);y = random.Next(rect.Height);w = random.Next(m / 50);h = random.Next(m / 50);.FillEllipse(hatchBrush, x, y, w, h);

}

// Clean up..Dispose();.Dispose();.Dispose();

// Set the image.= bitmap;

}

}

}


ОГЛАВЛЕНИЕ ВВЕДЕНИЕ . СИСТЕМНЫЙ АНАЛИЗ .1 Актуальность задачи .2 Выбор средств разработки .3 Выбор базы данных .4 Описание работы информац

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ