- •М іністерство освіти і науки України Харківський національний університет радіоелектроніки
- •Календарний план
- •1 Аналіз предметної області
- •2 Проектування системи
- •2.1 Побудова er-діаграми
- •3 Опис Реалізаціі
- •3.1 Опис програмних засобів та технологій.
- •3.2 Опис розробленого програмного продукту.
- •4 Тестування
- •Перелік посилань
3.2 Опис розробленого програмного продукту.
Робота з сайтом починається з входу. Даний додаток формально розподілен на такі логічні модулі :
авторизація/ реєстрація;
основний модуль.
Доступ до веб-клієнту відбувається через будь-який браузер. При відкритті головної сторінки сайту (рис.3.2), виводиться основна інформація про сервіс.
Модуль «Авторизація/реєстрація» включає в себе відокремлені частини авторизації та регістрації. Сторінка авторизації відображається як стандартна сторінка при першому вході на даний сайт. Передбачається, що користувач вводить свої особисті дані, такі як логін та пароль, які після натискання кнопки “Login” відправляються на сервер.
На сторінці авторизації знаходяться поля для введення email та паролю. Якщо користувач введе не валідний email, то після натискання кнопки “Login” він побаче повідомлення про помилку - Bad credentials. Також на сторінці авторизації знаходиться кнопка “Login”, при натисканні якої користувач потрапляє на сторінку реєстрації (рис.3.1).
Рисунок 3.1 – Сторінка реєстрації.
На кожній сторінці сайту є заголовочна частина, в якій знаходиться кнопки навігації та кнопка авторизації та виходу.
Рисунок 3.2 – Головна сторінка.
На сторінці «Administrator functionality» (рис 3.3) користувач-адміністратор може модерувати юзерів ( наприклад видаляти або змінювати їх персональні данні).
Рисунок 3.3 –Сторінка зi списком користувачiв.
Рисунок 3.4 – Сторінка пiдписок.
Авторизувавшись адмiнiстратор побачить сторiнку редагування ролей (рис 3.5) та отримає доступ до можливостi редагування ролей та доступ до списку користувачiв (рис 3.3).
Рисунок 3.5 – Сторiнка редагування ролей.
На сторінці зі списком нерухомості (рис 3.6) існує можливість сортування та фільтраціі.
При переході на сторінку конкретної нерухомості, будуть виведені усі її характеристики та її фото. Редактувати обявлення можуть лише їх властники та адміністратори.
Рисунок 3.6 –Сторінка зi списком нерухомостi
.
На сторінці персонального кабінету (рис 3.7) користувач має можливість редагування персональної інформації.
Рисунок 3.7 – Персональний кабiнет.
У Windows Phone клієнт у основна функціональність така ж як і у веб-кліенті, але є деякі відмінності, наприклад немає функцій адміністратора, є можливість продивитись на місцерозташування нерухомості за допомогою мапи з локацією цього будинку (рис 3.8 Б). Варто зазначити, що для реалiзацii функцiоналу мап було застосовано сервiс Bing Maps.
Рисунок 3.8 А– Сторiнка з описом нерухомостi. Б– Cторiнка з мапою.
Нижче приведена програмна реалізація класу, відповідаючого за сторінку з описом нерухомостi (рис. 3.9):
realty.Owner = this.userService.Get(this.User.Identity.Name);
if (!realty.Owner.PaidSeller)
this.TempData["Message"] = ColorfullMessages.SetDivs("You have to pay to sell", MessageType.danger);
return this.RedirectToAction("Index");
realty.Created = DateTime.Now;
realty.Photos = new List<ImageAttachments>();
realty.BuildCategory = this.buildCategoriesService.Where(c => c.CatName == cats).FirstOrDefault();
this.realtyService.Create(realty);
SubscriptionMessenger messenger = SubscriptionMessenger.Instance;
messenger.SendRealtyCreated(realty);
Рисунок 3.9 – Cторiнка з списком нерухомостi.
Структура класів розробленого Web-застосування представлена на рис 3.10
Рисунок 3.10 – Структура класiв розробленого застосування.
Нижче приведена реалізація контролеру [11], який відповідає на запити зі сторінки статистики. Це функція, яка відповідає за заповнення сторінки даними статистики за данний перiод часу:
private String populateStatistic (Data data, Model model) {
User user = authenticationHelper.getUserFromAuthentication();
Dictionary <Integer, List<Category>> categoryMap = categoryService.findForCurrentYear(user);
Dictionary <int, List<Category>>
familyCategoryMap = new List;
if(categoryMap.isEmpty()){
return "redirect:showCategoriesPage";
if(user.getCats()!=null)
for (User member : userService.getUsers()){ statisticsDictionary.putAll(catService.findForCurrentYear(member);
statisticsDictionary.Calculate();
}}
Таким чином заповнюється об’єкт model, з якого будуть братися дані вже на html сторінці:
this.ViewBag.CurrentSort = sortOrder;
this.ViewBag.DateSortParm =
sortOrder == "Date" ? "date_desc" : "Date";
this.ViewBag.Message = this.TempData["Message"];
IEnumerable<BuildCategories>cats= buildCategoriesService.GetAll();
var CatsName = new string[cats.Count() + 1];
CatsName[0] = "All";
ViewBag.CurrCat = "All";
ViewBag.CurrentFilter = searchString; Users user = this.Repo.Where(o => o.Login == login).SingleOrDefault();
bool rent = isCurrentUserListRented[this.User.Identity.Name];
this.ViewBag.Rent = rent;
IEnumerable<Realty> realties; IEnumerable<BuildCategories> cats = this.buildCategoriesService.GetAll();
}
У наступному методi виконуеться iнтеллектуальний пошук по сайту
IEnumerable<Realty> realt = this.realtyService.GetAllIncluding(x => x.BuildCategory, realty => realty.Owner)
.Where(x => x.IsForRent == model.IsForRent
&&(string.IsNullOrEmpty(model.Town)||.Address.Contains(model.Town))
&& !x.IsSold
&&(string.IsNullOrEmpty(model.Category) || x.BuildCategory.CatName ==model.Category)
&& (model.PriceLow == 0 || x.Price >= model.PriceLow)
&& (model.PriceHigh == 0 || x.Price <= model.PriceHigh)
&& (model.SquareLow == 0 || x.Square >= model.SquareLow)
&& (model.SquareLow == 0 || x.Square >= model.SquareLow1)
&& (model.SquareLow == 0 || x.Square >= model. PriceLow1)
&& (model.SquareLow == 0 || x.Square >= model. SquareHigh2)
&& (model.SquareLow == 0 || x.Square1 >= model.SquareLow3)
&& (model.SquareLow == 0 || x.Square2 >= model. CreatedLow2)
&& (model.SquareHigh == 0 || x.Square3 <= model.SquareHigh)
&& (model.CreatedLow == DateDefault || x.Created >= model.CreatedLow)
&& (model.CreatedHigh == DateDefault || x.Created <= model.CreatedHigh));
Функція Create викликається, коли користувач натиснув кнопку «Create» на сторінці додавання нового оголошення до родини. Тоді дані, які користувач ввів на сторінці [13] потрапляють до цього методу у формі об’єкту класу-сутності Realty.
void Create() { realty.Owner = this.userService.Get(this.User.Identity.Name); (!realty.Owner.PaidSeller)
this.TempData["Message"] = ColorfullMessages.SetDivs("You have to pay to sell", MessageType.danger);
return this.RedirectToAction("Index");
realty.Created = DateTime.Now;
realty.Photos = new List<ImageAttachments>();
realty.BuildCategory = this.buildCategoriesService.Where(c => c.CatName == cats).FirstOrDefault();
this.realtyService.Create(realty);
SubscriptionMessenger messenger = SubscriptionMessenger.Instance;
messenger.SendRealtyCreated(realty);
Logger.Info("realty " + realty.Named + " created");
this.TempData["Message"] = ColorfullMessages.SetDivs("Realty created succesfully", MessageType.success);
return this.RedirectToAction("Index");
Нижче приведена функція, яка викликається, коли користувач натиснув кнопку «Subscribe» біля однiєi категорii:
var subscr = this.userService.Get(this.User.Identity.Name);
var subscription = new Subscribe
{
Description = cat.CatName,
Name = cat.CatName,
Subscriber = subscr
this.subscribeService.Create(subscription);
AllTypes.FromAssemblyNamed(a)
.Pick()
.WithService.FirstInterface()
.Configure(o => o.LifestylePerWebRequest()));var args = new RealtyCreatedEventArgs();
args.Reallty = real;
args.TimeReached = DateTime.Now;
realtyAdded(null, args);
