Разработка веб-приложения для размещения объявлений
Ознакомление с функциями проектируемого интернет-сервиса, позволяющего размещать объявления. Рассмотрение описания полученного web-приложения. Характеристика структуры программы. Исследование особенностей интерфейса и инструкции пользования приложением.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 18.03.2015 |
Размер файла | 5,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Аннотация
В данной курсовой работе рассмотрены основные этапы создания Web-приложения, являющегося информационной системой, позволяющей пользователям размещать объявления на оказываемые ими услуги. Приложение разработано с использованием языка C# и паттерна программирования MVC, предназначено для установки на любой Web-сервер, который поддерживает данную версию языка. Рассмотрена база данных, разработанная в ходе работы, дается краткое описание основных частей (модулей) проекта, а также приведена полная инструкция пользователя.
Оглавление
- Постановка задачи
- Введение
- 1. Проектирование сервиса
- 1.1 Описание функциональных возможностей сервиса
- 1.2 Описание структуры разработанной базы данных
- 1.3 Диаграмма базы данных
- 2. Описание программного продукта
- 2.1 Язык и среда программирования
- 2.2 Описание полученного web-приложения
- 2.3 Структура программы
- 2.4 Программно-аппаратные требования
- 3. Описание интерфейса и инструкция пользования
- 3.1 Описание возможностей незарегистрированного пользователя
- 3.2 Описание интерфейса зарегистрированного пользователя
- 3.3 Описание возможностей модератора
- 3.4 Описание возможностей администратора
- Заключение
- Библиографический список
- Приложения
Постановка задачи
Необходимо разработать Web-приложение, представляющее собой информационную систему по размещению объявлений, с помощью которой модераторы смогут легко добавлять новые темы объявлений, а также размещать новости. Администраторы должны иметь возможность просматривать список всех пользователей, зарегистрированных в системе, просматривать объявления каждого пользователя, экспортировать в xml файл данные всех пользователей и их объявления, добавлять в систему новых модераторов. Для зарегистрированных пользователей должны быть предусмотрены следующие функции: размещение своих объявлений в информационной системе, добавление комментариев к существующим объявлениям, просмотр объявлений по каждой теме, редактирование своего профиля, удобный поиск объявлений по названию, краткому и полному описаниям, просмотр информации о каждом пользователе, просмотр и ранжирование пользователей по: имени, фамилии, году рождения, количеству постов и количеству комментариев.
Для разработки приложения использовать технологию ASP.NET MVC с движком представлений Razor и технологию ADO.NET Entity Framework.
Введение
В настоящее время все большую популярность стали приобретать сервисы, позволяющие размещать свои объявления для публичного доступа.
Методология и структура построения таких сервисов различна и зависит от личных предпочтений разработчика.
Приложение, написанное в рамках данной курсовой работы, представляет собой сервис, позволяющий размещать объявления на различные темы. Реализовано оно с использованием технологии ASP.NET MVC.
Данная технология представляет собой платформу для создания веб-приложений с использованием паттерна (шаблона) MVC (model - view - controller).
Работа над новой платформой была начата в 2007 году, а в 2009 году появилась первая версия. В итоге к текущему моменту уже было выпущено 5 версий платформы, а сам фреймворк обрел большую популярность по всему миру благодаря своей гибкости и адаптивности.[1]
Сравнение ASP.NET MVC и ASP.NET Web Forms
ASP.NET MVC является в некотором роде конкурентом для традиционных веб-форм.
Шаблон MVC, лежащий в основе новой платформы, подразумевает взаимодействие трех компонентов: контроллера (controller), модели (model) и представления (view). Рассмотрим их более подробно:
1. Контроллер (controller) представляет класс, с которого собственно и начинается работа приложения. Этот класс обеспечивает связь между моделью и представлением. Получая вводимые пользователем данные, контроллер, исходя из внутренней логики, при необходимости обращается к модели и генерирует соответствующее представление.[2]
2. Представление (view) - это собственно визуальная часть или пользовательский интерфейс приложения - например, html-страница, через которую пользователь, зашедший на сайт, взаимодействует с веб-приложением.
3. Модель (model) представляет набор классов, описывающих логику используемых данных.[3]
Общую схему взаимодействия упрощенно можно представить следующим образом:
Рисунок 1 ? Общая схема взаимодействия компонент MVC.
MVC имеет по сравнению с Web Forms следующие преимущества:
1. Разделение ответственности. В MVC приложение состоит из трех частей: контроллера, представления и модели, каждая из которых выполняет свои специфичные функции. В итоге приложение будет легче поддерживать модифицировать в будущем.[5]
2. В силу разделения ответственности приложения MVC обладают лучшей тестируемостью. Можно тестировать отдельные компоненты независимо друг от друга.
3. Соответствие протоколу HTTP. Приложения MVC в отличие от веб-форм не поддерживают объекты состояния (ViewState). Ясность и простота платформы позволяют добиться большего контроля над работой приложения
4. Гибкость. Можно настраивать различные компоненты платформы по своему усмотрению. Изменять какие-либо части конвейера работы MVC или адаптировать его к своим нуждам и потребностям.[4]
В то же время не стоит однозначно сбрасывать со счетов ASP.NET WebForms. Поскольку она также имеет свои сильные стороны, например, модель событий, которая будет ближе тем разработчикам, которые ранее занимались созданием клиентских приложений.
В традиционных веб-формах имеется контроль над разметкой, и можно в реальном времени в визуальном редакторе Visual Studio увидеть, как будет выглядеть та или иная страница. При работе с MVC Visual Studio подобного не позволяет делать.[3]
Из-за первого преимущества я и выбрал данную технологию создания Web-приложений. Поскольку мне удобнее и нагляднее разрабатывать приложение, состоящее из отдельных частей, каждая из которых несет определенную функциональность.
1. Проектирование сервиса
1.1 Описание функциональных возможностей сервиса
Незарегистрированные пользователи имеют возможность просматривать объявления, оставленные зарегистрированными пользователя, новости, добавленные модераторами или администраторами, зарегистрироваться, ранжировать всех зарегистрированных пользователей по: Id, имени, фамилии, году рождения, количеству добавленных постов или комментариев. Также имеется возможность выбора метода ранжирования: плотное (DENSE_RANK) и неплотное (DENSE).
При регистрации, пользователю автоматически назначается роль “user”. Также в системе предусмотрены роли “admin” и “moder”. У каждой роли имеются права на выполнение каких-либо операций.
Обычные пользователи могут:
1. Просматривать новости, добавляемые модераторами и администраторами.
2. Редактировать свой профиль (в том числе и добавлять себе аватарку).
3. Добавлять объявления.
4. Просматривать добавленные пользователями объявления.
5. Сортировать объявления по темам.
6. Просматривать личные данные других зарегистрированных пользователей.
7. Добавлять комментарии к объявлениям.
8. Искать объявления по названию, краткой и полной информации.
9. Ранжировать пользователей по различным характеристикам.
Модераторы, кроме всех вышеперечисленных действий, также имеют возможность:
1. Добавлять новые темы объявлений.
2. Добавлять новости.
Администраторы обладают все теми же правами, что и модераторы, но ещё имеют возможность:
1. Добавлять нового модератора.
2. Просматривать список всех пользователей.
3. Экспортировать данные о пользователях в xml файл.
1.2 Описание структуры разработанной базы данных
Описание таблицы базы данных Users (Сущность пользователь) представлено в таблице 1. Данная сущность используется в БД для аутентификации и регистрации пользователей.
Таблица 1. Сущность пользователя.
Название поля |
Тип поля |
Описание поля |
|
Id |
Int |
Уникальный идентификатор |
|
FirstName |
nvarchar(20) |
Имя |
|
LastName |
nvarchar(30) |
Фамилия |
|
|
nvarchar(50) |
|
|
Login |
nvarchar(50) |
Логин |
|
Mobile |
nvarchar(20) |
Мобильный телефон |
|
Adress |
nvarchar(100) |
Адрес |
|
Password |
nvarchar(MAX) |
Пароль |
|
UserYear |
int |
Год рождения |
|
CreationDate |
datetime |
Дата и время создания профиля |
|
RoleId |
int |
Идентификатор роли пользователя |
|
CountPosts |
int |
Количество оставленных объявлений |
|
CountComments |
int |
Количество оставленных комментариев |
|
Ava |
varbinary(MAX) |
Аватарка |
|
NameAva |
nvarchar(MAX) |
Имя аватарки |
Описание таблицы базы данных Roles (Сущность роли) представлено в таблице 2. Данная сущность используется в БД для хранения названий ролей, к которым могут относиться пользователи.
Таблица 2. Сущность роли.
Название поля |
Тип поля |
Описание поля |
|
Id |
int |
Уникальный идентификатор |
|
Name |
nvarchar(20) |
Имя |
Описание таблицы базы данных Declarations (Сущность объявления) представлено в таблице 3. Данная сущность используется в БД для хранения объявлений, которые могут оставлять пользователи.
Таблица 3. Сущность объявления.
Название поля |
Тип поля |
Описание поля |
|
Id |
int |
Уникальный идентификатор |
|
TopicId |
int |
Идентификатор темы объявления |
|
UserId |
int |
Идентификатор пользователя, оставившего данное объявление |
|
ShortDeclaration |
nvarchar(200) |
Краткое описание |
|
LongDeclaration |
nvarchar(2000) |
Полное описание |
|
Coast |
int |
Цена |
|
CreationDate |
datetime |
Дата и время создания |
|
Title |
nvarchar(70) |
Название |
Описание таблицы базы данных Topics (Сущность темы объявления) представлено в таблице 4. Данная сущность используется в БД для хранения названий тем, к которым могут относиться объявления.
Таблица 4. Сущность темы объявления.
Название поля |
Тип поля |
Описание поля |
|
Id |
int |
Уникальный идентификатор |
|
Name |
nvarchar(20) |
Название |
Описание таблицы базы данных Comments (Сущность комментария) представлено в таблице 5. Данная сущность используется в БД для хранения комментариев, которые могут добавлять пользователи.
Таблица 5. Сущность комментария.
Название поля |
Тип поля |
Описание поля |
|
Id |
int |
Уникальный идентификатор |
|
UserId |
int |
Идентификатор пользователя, добавившего данный комментарий |
|
DeclarationId |
int |
Идентификатор объявления, к которому относится данный комментарий |
|
Text |
nvarchar(300) |
Текст |
|
CreationDate |
datetime |
Дата и время создания |
Описание таблицы базы данных News (Сущность новости) представлено в таблице 6. Данная сущность используется в БД для хранения новостей, которые могут добавлять модераторы или администраторы.
Таблица 6. Сущность новости.
Название поля |
Тип поля |
Описание поля |
|
Id |
int |
Уникальный идентификатор |
|
Title |
nvarchar(40) |
Название |
|
Text |
nvarchar(300) |
Текст |
|
UserId |
int |
Идентификатор пользователя, добавившего данную новость |
|
CreationDate |
datetime |
Дата и время создания |
1.3 Диаграмма базы данных
Все сущности базы данных, созданной в рамках курсовой работы, представлены на рисунке 2.
Рисунок 2 ? Диаграмма созданной базы данных.
2. Описание программного продукта
2.1 Язык и среда программирования
Данный программный продукт был реализован на языка программирования С# с использованием фреймворка ASP.NET MVC и движка представлений Razor. В качестве среды разработки была выбрана Microsoft Visual Studio 2012.
Выбор данных средств обусловлен удобством их использования.
2.2 Описание полученного web-приложения
В приложении, реализованном в рамках данной курсовой работы, есть все функции для быстрого и удобного добавления объявлений. А, используя функция поиска, можно моментально найти необходимое объявление.
2.3 Структура программы
Разработанное приложение состоит из моделей, контроллеров и представлений.
Контроллеры:
1. AccountController - используется для регистрации и авторизации пользователей, изменения профиля пользователя, добавления объявления и добавления аватарки (смотри приложение 1).
2. HomeController - используется для получения информации, отображаемой на главной странице, получения информации о пользователе, поиска, ранжирования пользователей, получения статистики (смотри приложение 2).
3. DeclarationController - используется для получения подробной информации об объявлениях а также для получения комментариев для каждого объявления (смотри приложение 3).
4. AdminModerController - реализует функции, доступные администраторам и модераторам. К числу таких функций относятся: добавление тем объявлений, добавление модераторов, экспорт данных, получение списка пользователей (смотри приложение 4).
Модели:
1. User - модель, представляющая собой сущность пользователя (смотри приложение 5) [17-37]
2. Role - модель, представляющая собой сущность роли пользователя (смотри приложение 5) [39-43]
3. LogOnModel - модель авторизации (смотри приложение 5) [45-58]
4. RegisterModel - модель регистрации (смотри приложение 5) [60-107]
5. Topic - модель, представляющая собой сущность темы объявления (смотри приложение 6) [8-14]
6. Declaration - модель, представляющая собой сущность объявления (смотри приложение 6) [16-48]
7. Comment - модель, представляющая собой сущность комментария (смотри приложение 6) [50-66]
8. New - модель, представляющая собой сущность новости (смотри приложение 6) [68-85]
9. Search - модель поиска (смотри приложение 6) [87-93]
10. Station - модель для Google карт (смотри приложение 7)
Представления:
1. Account
§ AddAva - представление добавления аватарки (смотри приложение 8)
§ CreateDescriprion - представление создания объявления (смотри приложение 9)
§ EditProfile - представление редактирования профиля (смотри приложение 10)
§ Login - представление авторизации (смотри приложение 11)
§ Profile - представление просмотра профиля (смотри приложение 12)
§ Register- представление регистрации (смотри приложение 13)
2. AdminModer
§ AddModer - представление добавления модератора (смотри приложение 14)
§ AddNew - представление добавления новости (смотри приложение 15)
§ AddTopic - представление добавления темы объявления (смотри приложение 16)
§ GetDeclarationsForUser - представление, отображающее список всех объявлений выбранного пользователя (смотри приложение 17)
§ GetUsers - представление, отображающее список всех пользователей (смотри приложение 18)
3. Declaration
Details - представление, отображающее подробную информации об объявлении (смотри приложение 19)
4. Home
§ About - представление, отображающее карту(смотри приложение 20)
§ DetailsNew - представление, отображающее подробную информацию о выбранной новости(смотри приложение 21)
§ DetailsUser - представление, отображающее подробную информацию о выбранном пользователе (смотри приложение 22)
§ Index - представление главной страницы (смотри приложение 23)
§ Rank - представление ранжирования пользователей (смотри приложение 24)
§ Search- представление поиска (смотри приложение 25)
§ Statistics- представление статистики (смотри приложение 26)
§ Topic- представление, отображающее все объявления выбранной темы (смотри приложение 27)
5. Shared
§ _Footer - представление футера (смотри приложение 28)
§ _Header- представление хедера (смотри приложение 29)
§ _Layout- представление мастер страницы (смотри приложение 30)
§ _DetailUserScript- представление, содержащее скрипт для формы отображения информации о пользователе и новостях (смотри приложение 31)
2.4 Программно-аппаратные требования
Приложение является Web - сервисом, поэтому программные аппаратные требования для сервера и для клиента будут немного отличаться.
Для сервера:
1. ОС (операционная система): Любая операционная система, которая поддерживает установку HTTP-сервера;
2. ОЗУ объемом 1 ГБ;
3. 5 Гб доступного пространства на жестком диске;
4. Платформа .NET 4.5 и выше;
5. Любой HTTP-сервер;
6. СУБД: Microsoft SQL Server 2008 и выше.
Для клиента:
1. ОС: Любая операционная система, поддерживающая интернет соединение, и имеющая возможность установки интернет - браузера;
2. Любой интернет - браузер;
3. Клавиатура, мышь/тачпад.
3. Описание интерфейса и инструкция пользования
3.1 Описание возможностей незарегистрированного пользователя
Незарегистрированный пользователь может просматривать добавленные объявления, комментарии к ним, ранжировать пользователей по различным характеристикам, смотреть статистику, смотреть карту.
Работа с системой начинается с главной страницы, представленной на рисунке 3.
Рисунок 3 ? Главная страница ресурса
Страница содержит:
1. Навигационную панель со страницами:
§ Главная страница
§ Поиск
§ Ранжирование
§ Статистика
§ Карта
2. Объявления, добавленные пользователями
3. Новости, добавленные модераторами/администраторами
4. Темы объявлений, при нажатии на которые отображаются объявления, соответствующие выбранной теме.
Незарегистрированный пользователь может просматривать информацию о любом пользователе. Для этого он должен нажать на логин любого пользователя на главной странице. Форма, отображающая информацию о пользователе, изображена на рисунке 4.
Рисунок 4 ? Форма, отображающая информацию о пользователе.
Кроме этого пользователь может просматривать полную информацию по каждому объявлению, а также комментарии выбранного объявления. Для этого он должен нажать на название любого объявления. Полная информация об объявлении изображена на рисунке 5.
Рисунок 5 ? Полная информация об объявлении.
Также незарегистрированный пользователь может просматривать новости, расположенные на главной странице. Для этого ему необходимо нажать на название новости в колонке “Новости” на главной странице. Форма отображения новости изображена на рисунке 6.
Рисунок 6 ? Форма отображения новости.
Кроме этого незарегистрированный пользователь может просматривать и ранжировать по различным характеристикам список всех зарегистрированных пользователей. Для этого ему необходимо перейти в раздел “Ранжирование”, нажав на одноименное название, расположенное в хедере сайта. Форма ранжирования показана на рисунке 7.
Рисунок 7 ? Форма ранжирования пользователей.
Незарегистрированный пользователь имеет возможность просматривать карту Google, перейдя по ссылке “Карта”, расположенной в хедере сайта. Форма, отображающая карту, изображена на рисунке 8.
Рисунок 8 ? Форма, отображающая карту Google
Незарегистрированный пользователь может просматривать статистику, касающуюся количество пользователей в каждой группе и количества объявлений в каждой теме, перейдя по ссылке “Статистика” из хедера сайта. Форма, отображающая статистику, показана на рисунке 9.
Рисунок 9 ? Форма статистики.
Также незарегистрированный пользователь может воспользоваться поиском объявлений по названию, краткому или полному описанию. Для этого необходимо перейти в раздел “Поиск”, нажав одноименную ссылку в хедере сайта. Форма поиска изображена на рисунке 10.
Рисунок 10 ? Форма поиска.
Незарегистрированный пользователь регистрируется в системе, проходя по ссылке “Регистрация”.
После того, как пользователь перейдет по вышеуказанной ссылке, увидит форму регистрации, показанную на рисунке 11.
Рисунок 11 ? Форма регистрации.
Зарегистрированный пользователь может авторизоваться, перейдя с главной страницы к форме входа по ссылке “Выполнить вход”. В окне авторизации, пользователь должен ввести свой логин и пароль в соответствующие поля, затем нажать на кнопку “Войти”. Форма для авторизации показана на рисунке 12.
Рисунок 12 ? Форма авторизации.
3.2 Описание интерфейса зарегистрированного пользователя
У каждого зарегистрированного в системе пользователя имеется свой личный кабинет, попасть в который он может, нажав на свой логин, который появится на главной странице после прохождения процедуры авторизации.
Личный кабинет пользователя показан на рисунке 13.
Рисунок 13 ? Личный кабинет пользователя.
В личном кабинете пользователь может редактировать свои данные, введенные при регистрации. Для этого необходимо нажать на ссылку “Изменить профиль”. После перехода по ней, появится форма редактирования профиля. Внеся необходимые изменения, пользователь должен нажать на кнопку “Отправить”, чтобы внесенные изменения вступили в силу. Форма редактирования профиля изображена на рисунке 14.
Рисунок 14 ? Форма редактирования профиля.
Также из личного кабинета пользователь установить себе аватарку (а в случае, если она установлена, изменить её). Для этого необходимо из личного кабинета пройти по ссылке “Установить аву” (если она уже установлена, то “Изменить аву”). Перейдя к форме добавления аватарки, пользователь должен нажать на кнопку “Выбрать файл”, после того, как нужный файл будет выбран, ввести его имя в соответствующее поле ввода. Затем необходимо нажать кнопку “Добавить”. Форма добавления/изменения аватарки изображена на рисунке 15.
Рисунок 15 ? Форма добавления/изменения аватарки.
Для того чтобы разместить объявление, пользователь должен нажать на ссылку “Разместить объявление” в личном кабинете. Появится форма ввода объявления, изображенная на рисунке 16. После заполнения всех полей ввода, и выбора темы объявления, пользователь должен нажать на кнопку “Добавить”. интернет объявление web программа
Рисунок 16 ? Форма добавления объявления.
Зарегистрированные пользователи могут добавлять комментарии к объявлениям. Для того, чтобы это сделать, необходимо с главной страницы перейти к необходимому комментарию, нажав на его название. В открывшейся форме ввода ввести текст комментария и нажать на кнопку “Добавить”. Форма ввода текста комментария изображена на рисунке 17.
Рисунок 17 ? Форма ввода комментария.
3.3 Описание возможностей модератора
Модераторы имеют все функции, доступные зарегистрированным пользователям, но кроме этого, они могут добавлять темы объявлений и новости.
Для добавления новой темы объявлений модератор должен перейти в свой личный кабинет и нажать на ссылку “Добавить топик”. В загрузившейся форме ввода необходимо ввести название новой темы и нажать на кнопку добавить. Форма добавления темы объявлений изображена на рисунке 18.
Рисунок 18 ? Форма добавления темы объявлений.
Также модератор может добавить новость. Для этого ему из личного кабинета необходимо пройти по ссылке “Добавить новость”, заполнить форму ввода и нажать на кнопку “Добавить”. Форма добавления новости изображена на рисунке 19.
Рисунок 19 ? Форма добавления новости.
3.4 Описание возможностей администратора
Администраторы имеют все функции, доступные модераторам, но кроме этого, они могут добавлять модераторов и экспортировать различные данные, связанные с пользователями. Для добавления модератора, администратор должен из личного кабинета перейти по ссылке “Добавить модера”, заполнить все необходимые поля ввода и нажать на кнопку “Добавить”. Форма добавления модератора показана на рисунке 20.
Рисунок 20 ? Форма добавления модератора.
Для экспорта данных в xml файл администратор должен перейти по ссылке “Пользователи” из личного кабинета. Откроется форма, отображающая всех зарегистрированных в системе пользователей. Для экспорта данных о конкретном пользователе, администратор должен нажать на ссылку “Экспорт данных” напротив необходимого пользователя. Чтобы экспортировать все объявления пользователей, администратор должен в той же форме “Пользователи” нажать на ссылку “Экспортировать все объявления” в конце списка пользователей, для экспорта информации о всех пользователей - на ссылку “Экспортировать всех пользователей”. Форма экспорта данных изображена на рисунке 21.
Рисунок 21 ? Форма экспорта данных.
Заключение
В рамках курсовой работы было разработано web-приложение, представляющее собой информационную систему, позволяющую пользователям оставлять объявления на оказываемые ими услуги. Данное приложение позволяет быстро найти интересующие их объявления и оставить свои. Для удобства и наглядности, каждое объявление расположено в отдельном блоке.
Для управления сайтом предусмотрено две управляющие роли: модераторы и администраторы. Пользователи, относящиеся к первой группе, могут, помимо основных функций зарегистрированных пользователей, добавлять новости и создавать темы объявлений. Самая привилегированная группа пользователей - администраторы. Помимо функций модераторов, они также имеют возможность добавлять модераторов и экспортировать различные данные из базы данных. Стоит также отметить возможность ранжирования (сортировки) всех зарегистрированных пользователей по: имени, фамилии, году рождения, количеству добавленных объявлений и количеству добавленных комментариев. Данная функция позволяет быстро и удобно отсортировать пользователей по необходимому полю, объединив однотипных (по этому полю) пользователей в одну группу.
Web-приложение разработано на языке программирования C# с использованием фреймворка ASP.NET MVC, движка представлений Razor и Entity Framework-а, обеспечивающему удобный интерфейс для работы с базой данных. Проект построен по шаблону Basic (простой).
В разработанном приложении, реализованном в рамках курсовой работы, были учтены все требования, накладываемые на данный вид работы. В частности, реализовано полноценное веб-приложение на основе БД с пользовательским интерфейсом, созданы контроллеры, модели и представления, использована система валидации MVC, создана система регистрации и аутентификации. В качестве дополнительной компоненты была использована библиотека JQuery, необходимая для отображения данных о пользователе и новостях в отдельном графическом окне.
Стоит отметить что, системы, подобные реализованной в рамках данной работы, в настоящее время очень популярны. Многие люди стремятся предложить какие-либо свои услуги, что-то продать или приобрести. Именно для осуществления этих целей и служит разработанная информационная система, которая позволяет без труда найти необходимый товар или услугу или разместить какое-либо объявление.
Реализованная система вполне подойдет как для городского, так и для регионального использования.
Библиографический список
1. Metanit. Работа с MVC. 2012. URL: http://metanit.com/sharp/mvc/ (Дата обращения: 18.04.2014)
2. 4turista. Карты Google с удобным просмотром координат. 2007. URL: http://www.4turista.ru/node/261(Дата обращения: 12.05.2014)
3. habrahabr. ASP.NET MVC. 2006. URL: http://habrahabr.ru/post/175999/ (Дата обращения: 23.04.2014)
4. MSDN. Code First Migrations. 2014. URL: http://msdn.microsoft.com/ru-ru/data/jj591621.aspx (Дата обращения: 15.05.2014)
5. Skillcoding. 6 видео-уроков по использованию технологии ASP.NET MVC. 2010. URL: http://skillcoding.com/Default.aspx?id=240 (Дата обращения: 09.04.2014)
Приложения
Приложение 1
Листинг класса-контроллера AccountController, реализованного в файле AccountController.cs
using System;
using System.Web;
using System.Web.Mvc;
using MVC_Kurs.Models;
using System.Web.Security;
using MVC_Kurs.Providers;
using System.Data;
using System.Web.Helpers;
using System.Data.Entity;
using System.IO;
namespace MVC_Kurs.Controllers
{
[AllowAnonymous]
public class AccountController : Controller
{
UserContext db = new UserContext();
CustomMembershipProvider usr = new CustomMembershipProvider();
public ActionResult Login()
{
return View();
}
[HttpPost]
public ActionResult Login(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "Неверный пароль или логин");
}
}
return View(model);
}
public ActionResult LogOff()
{
FormsAuthentication.SignOut();
return RedirectToAction("Index", "Home");
}
public ActionResult Register()
{
return View();
}
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
MembershipUser membershipUser = ((CustomMembershipProvider)Membership.Provider).CreateUser(model.Login, model.Password, model.FirstName, model.LastName,
model.Mobile, model.Email, model.Adress, model.UserYear, false, false);
if (membershipUser != null)
{
FormsAuthentication.SetAuthCookie(model.Login, false);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "Этот логин уже занят!");
}
}
return View(model);
}
[Authorize]
public ActionResult Profile()
{
User user = usr.GetUserProfile(User.Identity.Name);
ViewBag.UserFirstName = user.FirstName;
ViewBag.UserLastName = user.LastName;
ViewBag.UserYear = user.UserYear;
ViewBag.UserLogin = user.Login;
ViewBag.UserAdress = user.Adress;
ViewBag.UserEmail = user.Email;
ViewBag.UserData = user.CreationDate;
ViewBag.UserPosts = user.CountPosts;
ViewBag.UserMobile = user.Mobile;
ViewBag.Ava = user.Ava;
ViewBag.UserRoleId = user.RoleId;
return View();
}
[Authorize]
[HttpGet]
public ActionResult EditProfile(int? id)
{
id = usr.GetId(User.Identity.Name);
if (id == null)
{
return HttpNotFound();
}
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
return View(user);
}
[Authorize]
[HttpPost]
public ActionResult EditProfile(User user)
{
if (User.Identity.Name != user.Login)
{
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
LogOff();
return Redirect("~/Account/Login");
}
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
return Redirect("~/Account/Profile");
}
[Authorize]
public ActionResult CreateDescripition()
{
SelectList topics = new SelectList(db.Topics, "Id", "Name");
ViewBag.Topics = topics;
return View();
}
[Authorize]
[HttpPost]
public ActionResult CreateDescripition(Declaration model)
{
model.CreationDate = DateTime.Now;
CustomMembershipProvider provider = new CustomMembershipProvider();
User user = provider.GetUserProfile(User.Identity.Name);
model.UserId = user.Id;
user.CountPosts++;
db.Entry(user).State = EntityState.Modified;
try
{
db.Declarations.Add(model);
db.SaveChanges();
return Redirect("~/Home/Index");
}
catch
{
return HttpNotFound();
}
}
public ActionResult AddAva(int? id)
{
id = usr.GetId(User.Identity.Name);
if (id == null)
{
return HttpNotFound();
}
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
return View(user);
}
[Authorize]
[HttpPost]
public ActionResult AddAva(User pic, HttpPostedFileBase uploadImage)
{
if (uploadImage != null)
{
byte[] imageData = null;
// считываем переданный файл в массив байтов
using (var binaryReader = new BinaryReader(uploadImage.InputStream))
{
imageData = binaryReader.ReadBytes(uploadImage.ContentLength);
}
// установка массива байтов
pic.Ava = imageData;
db.Entry(pic).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Profile");
}
return HttpNotFound();
}
}
}
Приложение 2
Листинг класса-контроллера HomeController, реализованного в файле HomeController.cs
using System.Linq;
using System.Web.Mvc;
using MVC_Kurs.Models;
using System.Data.Entity;
using System.Collections.Generic;
using System.Data.SqlClient;
namespace MVC_Kurs.Controllers
{
public class HomeController : Controller
{
UserContext db = new UserContext();
public ActionResult Index()
{
var declarations = db.Declarations.Include(p => p.User).Include(x => x.Topic);
ViewBag.LeftSection = db.Topics;
var news = db.News;
ViewBag.News = news;
return View(declarations.ToList());
}
public ActionResult DetailsUser(int? id)
{
if (id == null)
{
return HttpNotFound();
}
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
return PartialView("DetailsUser", user);
}
public ActionResult About()
{
return View();
}
public ActionResult Topic(int? id)
{
if (id == null)
{
return HttpNotFound();
}
var topicI = db.Declarations.Include(p => p.User).Include(x => x.Topic).Where(a => a.TopicId == id);
return View(topicI.ToList());
}
public ActionResult DetailsNew(int? id)
{
if (id == null)
{
return HttpNotFound();
}
New news = db.News.Find(id);
if (news == null)
{
return HttpNotFound();
}
return PartialView("DetailsNew", news);
}
public JsonResult GetData()
{
// создадим список данных
List<Station> stations = new List<Station>();
stations.Add(new Station()
{
Id = 1,
PlaceName = "Общежитие №2",
GeoLat = 47.208,
GeoLong = 38.93615,
});
return Json(stations, JsonRequestBehavior.AllowGet);
}
public ActionResult Search()
{
return View();
}
[HttpPost]
public ActionResult Search(Search str, string[] list)
{
dynamic declarations = null;
if (list[0] == "Названию")
{
declarations = db.Declarations.Where(a => a.Title.Contains(str.Name)).Include(x => x.User).Include(x => x.Topic);
}
else if (list[0] == "Краткому описанию")
{
declarations = db.Declarations.Where(a => a.ShortDeclaration.Contains(str.Name)).Include(x => x.User).Include(x => x.Topic);
}
else if (list[0] == "Полному описанию")
{
declarations = db.Declarations.Where(a => a.LongDeclaration.Contains(str.Name)).Include(x => x.User).Include(x => x.Topic);
}
ViewBag.SearchDeclarations = declarations;
return View();
}
public ActionResult Rank()
{
return View();
}
[HttpPost]
public ActionResult Rank(string[] list, string[] method)
{
string ConnectionString = @"Data Source=(LocalDb)\v11.0;Integrated Security=true;AttachDBFilename=|DataDirectory|\DataDB.mdf";
SqlConnection con = new SqlConnection(ConnectionString);
string sql = "SELECT row_number() over(order by Id)'Number', LastName, FirstName, UserYear, CountPosts, CountComments, " + method[0] +"() over(ORDER BY " + list[0] +") rnk FROM Users";
SqlCommand cmd = new SqlCommand(sql, con);
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
List<string> lastName = new List<string>();
List<string> firstName = new List<string>();
List<string> rank = new List<string>();
List<string> row_number = new List<string>();
List<string> UserYear = new List<string>();
List<string> CountPosts = new List<string>();
List<string> CountComments = new List<string>();
while (reader.Read())
{
firstName.Add(reader["FirstName"].ToString());
lastName.Add(reader["LastName"].ToString());
row_number.Add(reader["Number"].ToString());
rank.Add(reader["rnk"].ToString());
UserYear.Add(reader["UserYear"].ToString());
CountPosts.Add(reader["CountPosts"].ToString());
CountComments.Add(reader["CountComments"].ToString());
ViewBag.LastName = lastName.ToArray();
ViewBag.FirstName = firstName.ToArray();
ViewBag.Rank = rank.ToArray();
ViewBag.Row = row_number.ToArray();
ViewBag.UserYear = UserYear.ToArray();
ViewBag.CountPosts = CountPosts.ToArray();
ViewBag.CountComments = CountComments.ToArray();
}
con.Close();
return View();
}
public ActionResult Statistics()
{
string ConnectionString = @"Data Source=(LocalDb)\v11.0;Integrated Security=true;AttachDBFilename=|DataDirectory|\DataDB.mdf";
SqlConnection con = new SqlConnection(ConnectionString);
string sql = "SELECT 'SumUsers' AS RolesId, [1] as a, [2] as u, [3] as m FROM (SELECT RoleId, Id FROM Users) AS SourceTable PIVOT(Count(Id)FOR RoleId IN ([1], [2], [3])) AS PivotTable;";
SqlCommand cmd = new SqlCommand(sql, con);
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
ViewBag.CountAdmins = reader["a"];
ViewBag.CountModers = reader["m"];
ViewBag.CountUsers = reader["u"];
}
sql = "select Topics.Name, count(Declarations.TopicId) as num from Topics inner join Declarations on Declarations.TopicId = Topics.Id group by Topics.Name;";
cmd = new SqlCommand(sql, con);
reader.Close();
reader = cmd.ExecuteReader();
List<string> names = new List<string>();
List<string> count = new List<string>();
while (reader.Read())
{
names.Add(reader["Name"].ToString());
count.Add(reader["num"].ToString());
}
ViewBag.Names = names.ToArray();
ViewBag.Count = count.ToArray();
con.Close();
return View();
}
}
}
Приложение 3
Листинг класса-контроллера DeclarationController, реализованного в файле DeclarationController.cs
using System;
using System.Linq;
using System.Web.Mvc;
using MVC_Kurs.Models;
using System.Data.Entity;
using MVC_Kurs.Providers;
using System.Collections.Generic;
namespace MVC_Kurs.Controllers
{
public class DeclarationController : Controller
{
UserContext db = new UserContext();
static int DeclarId = 0;
public ActionResult Details(int? id)
{
if (id != null)
{
Declaration declaration = (from u in db.Declarations
where u.Id == id
select u).FirstOrDefault();
var UserDeclar = (from u in db.Users
where u.Id == declaration.UserId
select u).FirstOrDefault();
var TopicDeclar = (from u in db.Topics
where u.Id == declaration.TopicId
select u).FirstOrDefault();
ViewBag.Declaration = declaration;
DeclarId = declaration.Id;
// Всякие другие объявления
var comments = db.Comments.Include(p => p.Declaration).Include(x => x.User).Where(y => y.DeclarationId == DeclarId);
ViewBag.Comments = comments;
return View();
}
return HttpNotFound();
}
[Authorize]
[HttpPost]
public ActionResult Details(Comment model)
{
model.CreationDate = DateTime.Now;
CustomMembershipProvider provider = new CustomMembershipProvider();
User user = provider.GetUserProfile(User.Identity.Name);
model.UserId = user.Id;
user.CountComments++;
db.Entry(user).State = EntityState.Modified;
model.DeclarationId = DeclarId;
try
{
db.Comments.Add(model);
db.SaveChanges();
return Redirect("~/Home/Index");
}
catch
{
return HttpNotFound();
}
return View();
}
}
}
Приложение 4
Листинг класса-контроллера AdminModerController, реализованного в файле AdminModerController.cs
using MVC_Kurs.Models;
using MVC_Kurs.Providers;
using System;
using System.Web.Mvc;
using System.Web.Security;
using System.Data.Entity;
using System.Linq;
using System.IO;
using System.Collections.Generic;
namespace MVC_Kurs.Controllers
{
[Authorize]
public class AdminModerController : Controller
{
UserContext db = new UserContext();
CustomMembershipProvider usr = new CustomMembershipProvider();
public ActionResult AddTopic(int? id)
{
id = usr.GetId(User.Identity.Name);
if (id == null)
{
return HttpNotFound();
}
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
if (user.RoleId == 2)
{
return Redirect("/Home/Index");
}
return View();
}
[HttpPost]
public ActionResult AddTopic(Topic model)
{
try
{
db.Topics.Add(model);
db.SaveChanges();
return Redirect("~/Home/Index");
}
catch
{
return HttpNotFound();
}
}
public ActionResult AddNew(int? id)
{
id = usr.GetId(User.Identity.Name);
if (id == null)
{
return HttpNotFound();
}
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
if (user.RoleId == 2)
{
return Redirect("/Home/Index");
}
return View();
}
[HttpPost]
public ActionResult AddNew(New news)
{
int? id = usr.GetId(User.Identity.Name);
news.UserId = (int)id;
news.CreationDate = DateTime.Now;
try
{
db.News.Add(news);
db.SaveChanges();
}
catch
{
return HttpNotFound();
}
return Redirect("/Home/Index");
}
public ActionResult AddModer(int? id)
{
id = usr.GetId(User.Identity.Name);
if (id == null)
{
return HttpNotFound();
}
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
if ((user.RoleId == 2) || (user.RoleId == 3))
{
return Redirect("/Home/Index");
}
return View();
}
[HttpPost]
public ActionResult AddModer(RegisterModel model)
{
if (ModelState.IsValid)
{
MembershipUser membershipUser = ((CustomMembershipProvider)Membership.Provider).CreateUser(model.Login, model.Password, model.FirstName, model.LastName,
model.Mobile, model.Email, model.Adress, model.UserYear, true, false);
if (membershipUser != null)
{
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "Этот логин уже занят!");
}
}
return RedirectToAction("Index", "Home");
}
public ActionResult GetUsers()
{
var Users = db.Users.Include(x => x.Role);
ViewBag.Users = Users;
return View();
}
[Authorize]
public ActionResult GetDeclarationsForUser(int? id)
{
if (id == null)
{
return HttpNotFound();
}
var declarations = db.Declarations.Include(x => x.Topic).Include(a => a.User).Where(p => p.UserId == id);
return View(declarations.ToList());
}
[Authorize]
public ActionResult ExportDataForUser(int? id)
{
if (id == null)
{
return HttpNotFound();
}
CustomMembershipProvider custom = new CustomMembershipProvider();
User user = custom.GetUserProfile((int)id);
#region
using (StreamWriter write = new StreamWriter(@"C:\" + user.LastName + user.FirstName + ".xml", false))
{
var declarations = db.Declarations.Include(x => x.Topic).Include(a => a.User).Where(p => p.UserId == id);
write.WriteLine("<xml>");
write.WriteLine(" <user Login='" + user.Login + "'/>");
write.WriteLine(" <FirstName='" + user.FirstName + "'/>");
write.WriteLine(" <LastName='" + user.LastName + "'/>");
write.WriteLine(" <BirthYear='" + user.UserYear + "'/>");
write.WriteLine(" <RegistrationDate='" + user.CreationDate + "'/>");
write.WriteLine(" <Mobile='" + user.Mobile + "'/>");
write.WriteLine(" <Email='" +user.Email +"'/>");
write.WriteLine(" <HomeAdress='" + user.Adress + "'/>");
write.WriteLine(" <Count posts='" + user.CountPosts + "'/>");
write.WriteLine(" <Count comments='" + user.CountComments + "'/>");
write.WriteLine(" <Declarations>");
foreach (var item in declarations)
{
write.WriteLine(" <Declaration id='" +item.Id +"'/>");
write.WriteLine(" <Title='" +item.Title +"'/>");
write.WriteLine(" <Topic='" + item.Topic.Name + "'/>");
write.WriteLine(" <Coast='" + item.Coast + "'/>");
write.WriteLine(" <ShortDeclaration='" + item.ShortDeclaration + "'/>");
write.WriteLine(" <LongDeclaration='" + item.LongDeclaration + "'/>");
write.WriteLine(" <CreationDate='" + item.CreationDate + "'/>");
write.WriteLine(" </Declaration>");
}
write.WriteLine(" </Declarations>");
write.WriteLine(" </user>");
write.WriteLine("</xml>");
write.Close();
}
#endregion
System.Diagnostics.Process.Start(@"C:\" + user.LastName + user.FirstName + ".xml");
return Redirect("/AdminModer/GetUsers");
}
[Authorize]
public ActionResult ExportDeclarationsAllUsers()
{
IEnumerable<Declaration> declarations = db.Declarations.Include(x => x.User).Include(x => x.Topic);
#region
using (StreamWriter write = new StreamWriter(@"C:\AllDeclaration.xml", false))
{
write.WriteLine("<xml>");
foreach (var item in declarations)
{
write.WriteLine(" <user Id='" + item.User.Id + "'Login='" + item.User.Login + "'/>");
write.WriteLine(" <FirstName='" + item.User.FirstName + "'/>");
write.WriteLine(" <LastName='" + item.User.LastName + "'/>");
write.WriteLine(" <BirthYear='" + item.User.UserYear + "'/>");
write.WriteLine(" <RegistrationDate='" + item.User.CreationDate + "'/>");
write.WriteLine(" <Mobile='" + item.User.Mobile + "'/>");
write.WriteLine(" <Email='" + item.User.Email + "'/>");
write.WriteLine(" <HomeAdress='" + item.User.Adress + "'/>");
write.WriteLine(" <Count posts='" + item.User.CountPosts + "'/>");
write.WriteLine(" <Count comments='" + item.User.CountComments + "'/>");
write.WriteLine(" <Declarations>");
write.WriteLine(" <Declaration id='" + item.Id + "'/>");
write.WriteLine(" <Title='" + item.Title + "'/>");
write.WriteLine(" <Topic='" + item.Topic.Name + "'/>");
write.WriteLine(" <Coast='" + item.Coast + "'/>");
write.WriteLine(" <ShortDeclaration='" + item.ShortDeclaration + "'/>");
write.WriteLine(" <LongDeclaration='" + item.LongDeclaration + "'/>");
write.WriteLine(" <CreationDate='" + item.CreationDate + "'/>");
write.WriteLine(" </Declaration>");
write.WriteLine(" </Declarations>");
write.WriteLine(" </user>");
write.WriteLine("");
}
write.WriteLine("</xml>");
write.Close();
}
#endregion
System.Diagnostics.Process.Start(@"C:\AllDeclaration.xml");
return Redirect("/AdminModer/GetUsers");
}
[Authorize]
public ActionResult ExportAllUsers()
{
#region
using (StreamWriter write = new StreamWriter(@"C:\AllUsers.xml", false))
{
IEnumerable<User> users = db.Users.Include(x => x.Role);
write.WriteLine("<xml>");
write.WriteLine(" <users>");
foreach (var item in users)
{
write.WriteLine(" <user Id='" + item.Id + "'Login='" + item.Login + "'/>");
write.WriteLine(" <FirstName='" + item.FirstName + "'/>");
write.WriteLine(" <LastName='" + item.LastName + "'/>");
write.WriteLine(" <BirthYear='" + item.UserYear + "'/>");
write.WriteLine(" <Role='" + item.Role.Name + "'/>");
write.WriteLine(" <RegistrationDate='" + item.CreationDate + "'/>");
write.WriteLine(" <Mobile='" + item.Mobile + "'/>");
write.WriteLine(" <Email='" + item.Email + "'/>");
write.WriteLine(" <HomeAdress='" + item.Adress + "'/>");
write.WriteLine(" <Count posts='" + item.CountPosts + "'/>");
write.WriteLine(" <Count comments='" + item.CountComments + "'/>");
write.WriteLine(" </user>");
write.WriteLine("");
}
write.WriteLine(" </users>");
write.WriteLine("</xml>");
write.Close();
}
#endregion
System.Diagnostics.Process.Start(@"C:\AllUsers.xml");
return Redirect("/AdminModer/GetUsers");
}
}
}
Приложение 5
Листинг класса-модели UserContext, реализованного в файле UserContext.cs
using System;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
namespace MVC_Kurs.Models
{
public class UserContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<Declaration> Declarations { get; set; }
public DbSet<Topic> Topics { get; set; }
public DbSet<Comment> Comments { get; set; }
public DbSet<New> News { get; set; }
}
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public int CountComments { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Login { get; set; }
public string Mobile { get; set; }
public string Adress { get; set; }
public string Password { get; set; }
public int UserYear { get; set; }
public DateTime CreationDate { get; set; }
public int? RoleId { get; set; }
public Role Role { get; set; }
public int CountPosts { get; set; }
public byte[] Ava { get; set; }
public string NameAva { get; set; }
}
public class Role
{
public int Id { get; set; }
public string Name { get; set; }
}
public class LogOnModel
{
[Required]
[Display(Name = "Логин")]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Пароль")]
public string Password { get; set; }
[Display(Name = "Запомнить")]
public bool RememberMe { get; set; }
}
public class RegisterModel
{
[Required]
[StringLength(20, ErrorMessage = "Имя должно иметь от 2 до 20 символов", MinimumLength = 2)]
[Display(Name = "Имя")]
public string FirstName { get; set; }
[Required]
[StringLength(30, ErrorMessage = "Фамилия должна иметь от 2 до 30 символов", MinimumLength = 2)]
[Display(Name = "Фамилия")]
public string LastName { get; set; }
[Required]
[StringLength(50, ErrorMessage = "Логин должен содержать от 3 до 50 символов", MinimumLength = 3)]
[Display(Name = "Логин")]
public string Login { get; set; }
[StringLength(50, ErrorMessage = "Адрес элетронной почты может иметь длину от 6 до 50 символов", MinimumLength = 6)]
[DataType(DataType.EmailAddress)]
[Display(Name = "Электронная почта")]
public string Email { get; set; }
[Required]
[StringLength(50, ErrorMessage = "Пароль должен иметь от 6 до 50 символов", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Пароль")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Подтвердить пароль")]
[Compare("Password", ErrorMessage = "Пароли не совпадают.")]
public string ConfirmPassword { get; set; }
[Required]
[StringLength(20, ErrorMessage = "Номер мобильного телефона может иметь длину от 9 до 20 символов", MinimumLength = 9)]
[Display(Name = "Номер мобильного")]
public string Mobile { get; set; }
[StringLength(100, ErrorMessage = "Домашний адрес может иметь длину от 10 до 100 символов", MinimumLength = 10)]
[Display(Name = "Домашний адрес")]
public string Adress { get; set; }
[Required]
[Range(1950, 2014, ErrorMessage = "Недопустимый год")]
[Display(Name = "Год рождения")]
public int UserYear { get; set; }
}
}
Приложение 6
Листинг класса-модели Declaration, реализованного в файле Declaration.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MVC_Kurs.Models
{
public class Topic
{
public int Id { get; set; }
[Display(Name = "Название")]
public string Name { get; set; }
public IEnumerable<Declaration> Declarations { get; set; }
}
public class Declaration
{
public int Id { get; set; }
public int TopicId { get; set; }
public Topic Topic { get; set; }
public int UserId { get; set; }
public User User { get; set; }
[Display(Name = "Название")]
[MinLength(2)]
[MaxLength(70)]
public string Title { get; set; }
[Display(Name = "Краткая информация")]
[MaxLength(200)]
[MinLength(5)]
public string ShortDeclaration { get; set; }
[Display(Name = "Полная информация")]
[MaxLength(2000)]
[MinLength(10)]
public string LongDeclaration { get; set; }
[Display(Name = "Цена")]
public int Coast { get; set; }
public DateTime CreationDate { get; set; }
}
public class Comment
{
public int Id { get; set; }
public int UserId { get; set; }
public User User { get; set; }
public int DeclarationId { get; set; }
public Declaration Declaration { get; set; }
[MinLength(0)]
[MaxLength(300)]
[Display(Name = "Текст комментария")]
public string Text { get; set; }
public DateTime CreationDate { get; set; }
}
public class New
{
public int Id { get; set; }
[Display(Name = "Название")]
[MinLength(2)]
[MaxLength(40)]
public string Title { get; set; }
[Display(Name = "Текст")]
[MinLength(2)]
[MaxLength(300)]
public string Text { get; set; }
public DateTime CreationDate { get; set; }
public int UserId { get; set; }
public User User { get; set; }
}
public class Search
{
[Required]
[StringLength(20, ErrorMessage = "Строка поиска должна содержать от 1 до 20 символов", MinimumLength = 1)]
[Display(Name = "Пиши сюда")]
public string Name { get; set; }
}
}
Приложение 7
Листинг класса-модели Station, реализованного в файле Station.cs
namespace MVC_Kurs.Models
{
public class Station
{
public int Id { get; set; }
public string PlaceName { get; set; } // название места
public double GeoLong { get; set; } // долгота - для карт google
public double GeoLat { get; set; } // широта - для карт google
}
}
Приложение 8
Листинг файла представления AddAva.cshtml
@model MVC_Kurs.Models.User
@{
ViewBag.Title = "Добавить аву";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm("AddAva", "Account", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.ValidationSummary()
<fieldset>
@Html.HiddenFor(m => m.Id)
@Html.HiddenFor(m => m.FirstName)
@Html.HiddenFor(m => m.LastName)
@Html.HiddenFor(m => m.Email)
@Html.HiddenFor(m => m.Login)
@Html.HiddenFor(m => m.Mobile)
@Html.HiddenFor(m => m.Adress)
Подобные документы
Назначение и структура таблиц, используемых в проекте. Задачи и требования приложения на уровне организации WEB-интерфейса. Функциональная структура программы. Алгоритм отображения разделов и подразделов. Процесс регистрации нового пользователя.
курсовая работа [1,0 M], добавлен 04.10.2010Мультимедийное представление информации. Разработка структуры сайта, макетов страниц, серверной логики и компьютерного кода, интерфейса. Описание шагов для размещения презентации в сети интернет. Затраты на разработку приложения и экономический эффект.
дипломная работа [539,0 K], добавлен 18.10.2015Рассмотрение игр, схожих по жанру и модели распространения с разрабатываемым приложением. Выбор среды разработки и сторонних библиотек. Проектирование интерфейса и подготовка графических материалов приложения. Особенности введения в игру микротрансакций.
дипломная работа [3,1 M], добавлен 18.11.2017Разработка клиент-серверного приложения, позволяющего взаимодействовать друг с другом с использованием доступа к базам данных. Проектирование связи сервера с базой данных с помощью технологии ODBC. Разработка интерфейса программы, ее тестирование.
курсовая работа [352,0 K], добавлен 24.08.2016Изучение истории достижений корпорации Oracle. Разработка клиент-серверного приложения на языке Delphi XE, реализующего возможность управления персоналом на предприятии. Основные структуры данных. Создание инструкции работы с приложением "Отдел кадров".
дипломная работа [974,7 K], добавлен 08.06.2013Общая характеристика командного интерфейса приложения в системе 1С: Предприятия. Особенности объектов конфигурации: справочников, документов, регистров накопления и отчетов. Разработка интерфейса приложения "Ремонт техники (от компьютера до пылесоса)".
курсовая работа [2,8 M], добавлен 06.11.2013Проведение исследования опыта взаимодействия в сети. Методы улучшения согласования с пользователем web-сервиса. Особенность проектирования онлайн-приложения. Изучение разработки контроллеров и моделей. Характеристика создания интерфейса программы.
дипломная работа [1,3 M], добавлен 11.08.2017Разработка программного кода и алгоритма действий приложения "калькулятор". Использование функций в программе Matlab. Разработка кнопок, опций, интерфейса, оформление. Части кода Matlab и тестовый набор. Инструкция пользователя по работе программы.
курсовая работа [527,1 K], добавлен 27.09.2014Разработка программного продукта - приложения, позволяющего заносить данные анкетирования в базу данных MS SQL. Описание логики работы приложения, особенности пользовательского интерфейса. Формы просмотра анкет, описание процедур и функций программы.
курсовая работа [1,2 M], добавлен 16.08.2012Определение назначения системы и обозначение целей создания Web-приложения интернет-магазина по продаже компьютерной техники. Описание страниц сайта и логической структуры приложения. Тестирование, применение приложения и затраты на его разработку.
дипломная работа [2,6 M], добавлен 10.06.2014